11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Quando IDENTITY_INSERT è OFF non è possibile inserire un valore esplicito per la colonna Identity nella tabella 'OperatoriAbilitatiInterventi'.

Questo significa che, da qualche parte nel tuo codice, stai impostando un valore alla proprietà IDOperatoreAbilitato, che è la chiave di OperatoriAbilitatiInterventi. Trova quel punto ed eliminalo.

Se non dovesse funzionare, può darsi che Entity Framework non sappia che quello è un valore autoincrementante ma... è strano, perché nel momento in cui decori una proprietà di tipo int con l'attributo [Key], per default la convenzione vuole che sia interpretata come chiave autoincrementante.
In caso prova ad essere esplicito aggiungendo questo attributo sulla proprietà IDOperatoreAbilitato, in aggiunta all'attributo Key che hai già.
[Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
public int IDOperatoreAbilitato { get; set; }


La documentazione è qui al paragrafo "DatabaseGenerated"
https://msdn.microsoft.com/it-it/data/jj591583.aspx

ciao,
Moreno
Modificato da BrightSoul il 05 agosto 2016 08.12 -

Enjoy learning and just keep making
229 messaggi dal 20 novembre 2014
Ciao Moreno,
intanto grazie sempre per la tua pazienza :)


Questo significa che, da qualche parte nel tuo codice, stai impostando un valore alla proprietà IDOperatoreAbilitato, che è la chiave di OperatoriAbilitatiInterventi. Trova quel punto ed eliminalo.


Non capisco bene cosa intendi io sto cercando di fare una semplicissima insert, ovvero sono sul controller Create di OperatoriAbilitatiInterventi che mi fa inserire l'utente e l'abilitazione... ho provato pure a cancellare IDOperatoreAbilitato dal bind del controller Create ma ovviamente non sta li il problema.
Ieri dal debug mi sono accorto che lui non incrementava la chiave per questo andava in conflitto, cerca di fare l'inserimento mettendo sempre zero.


Se non dovesse funzionare, può darsi che Entity Framework non sappia che quello è un valore autoincrementante ma... è strano, perché nel momento in cui decori una proprietà di tipo int con l'attributo [Key], per default la convenzione vuole che sia interpretata come chiave autoincrementante.
In caso prova ad essere esplicito aggiungendo questo attributo sulla proprietà IDOperatoreAbilitato, in aggiunta all'attributo Key che hai già.
[Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
public int IDOperatoreAbilitato { get; set; }


La documentazione è qui al paragrafo "DatabaseGenerated"
https://msdn.microsoft.com/it-it/data/jj591583.aspx


Purtroppo ho provato a settarla manualmente l'autoincrement sul db ma niente, l'ho fatto anche con code first facendo (l'annotation che hai postato non mi funziona)
[Key, System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]

adesso mi da un errore sul mapping che dice:
System.Data.Entity.Core.UpdateException: Errore durante l'aggiornamento delle voci. Per ulteriori dettagli, vedere l'eccezione interna. ---> System.InvalidOperationException: Viene eseguito il mapping di una proprietà dipendente in un elemento ReferentialConstraint a una colonna generata dall'archivio. Colonna: 'IDOperatoreAbilitato'.

ma vorrei capire, perchè? non vedo il senso di questa cosa
Grazie per il supporto
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


iene eseguito il mapping di una proprietà dipendente in un elemento ReferentialConstraint a una colonna generata dall'archivio. Colonna: 'IDOperatoreAbilitato'.

L'errore in inglese corrispondente è questo: "A dependent property in a ReferentialConstraint is mapped to a store-generated column".
Cercalo e vedi se trovi qualche soluzione.

Non mi è mai capitato di incontrarlo ma penso che significhi che hai mappato una relazione usando IDOperatoreAbilitato come foreign key. Questo non è possibile perché IDOperatoreAbilitato è ora una chiave autoincrementante e perciò Entity Framework non è libero di scriverci dentro l'ID dell'entità principale.

E' possibile che si sia trattato di un errore di battitura durante il mapping? Magari volevi scrivere IDOperatore anziché IDOperatoreAbilitato.
IDOperatore infatti la puoi usare come foreign key perché non è autoincrementante.

Tuttavia, questo è un consiglio buttato lì, io non ho alla mano il diagramma E/R più recente del tuo database e quindi non so come andrebbe mappato con EF.

ciao,
Moreno

Enjoy learning and just keep making
229 messaggi dal 20 novembre 2014
Ciao Moreno,
domani provo a cercare un po' in inglese vediamo se riesco a cavare il ragno dal buco...



E' possibile che si sia trattato di un errore di battitura durante il mapping? Magari volevi scrivere IDOperatore anziché IDOperatoreAbilitato.
IDOperatore infatti la puoi usare come foreign key perché non è autoincrementante.


Dubito, la chiave è IdOperatore questo è il mapping che mi avevi fatto tu, per sicurezza ho pure guardato nei post precedenti ed è corretto... questo problema mi farà ammattire, ti aggiorno.
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
puoi far vedere il codice che usi per il mapping tra le due entità?

Enjoy learning and just keep making
229 messaggi dal 20 novembre 2014
Ciao Moreno,
questo è il mapping


//Mappatura per associazione Personale->OperatoriAbilitatiInterventi
modelBuilder.Entity<Personale>()
//personale ha una collezione di operatori
.HasMany(personale => personale.OperatoreAbilitatoIntervento)
//non può esistere un record in operatoriabilitatiinterventi
//se non lo associo ad un personale
.WithRequired(oai => oai.Personale)
//per come è stata mappata la relazione,
//la foreign key si trova su operatoriabilitatiinterventi
.HasForeignKey(oai => oai.IdOperatore);


questo è il model Personale

public Personale()
{
OperatoreAbilitatoIntervento = new HashSet<OperatoriAbilitatiInterventi>();
}

[Key]
public int IDPersonale { get; set; }
[StringLength(200)]
[Display(Name = "Nome")]
public string Nome { get; set; }
[StringLength(200)]
[Display(Name = "Cognome")]
public string Cognome { get; set; }
[StringLength(100)]
[Display(Name = "Nome Utente")]
public string NomeUtente { get; set; }
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
//[StringLength(500)]
[Display(Name = "Ruolo")]
public int Ruolo { get; set; }
public Boolean Attivo { get; set; }

public virtual ICollection<OperatoriAbilitatiInterventi> OperatoreAbilitatoIntervento { get; set; }
}


mentre questo è il model di OperatoriAbilitatiInterventi

//Mappatura uno ad uno Tipo_TipoInterventi
public virtual Tipo_TipoInterventi TipoTipoIntervento { get; set; }

[Key, System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]

public int IDOperatoreAbilitato { get; set; }
[Display(Name = "Operatore")]
public int IdOperatore { get; set; }
[Display(Name = "Intervento")]
public int IdIntervento { get; set; }

public virtual Personale Personale { get; set; }

public string Utente { get; set; }
public DateTime Modifica { get; set; }

[Display(Name = "Attivo")]
public Boolean Attivo { get; set; }


Grazie
Modificato da clr4633 il 10 agosto 2016 09.21 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, prego.

Penso che la causa non sia nella relazione uno-a-molti che hai postato, ma in quest'altra:
//Mappatura uno ad uno Tipo_TipoInterventi
public virtual Tipo_TipoInterventi TipoTipoIntervento { get; set; }

Puoi far vedere come hai mappato questa relazione uno-ad-uno?
Ricorda che per realizzare questo tipo di relazione è necessario che l'entità dipendente abbia una colonna che è sia chiave primaria non autoincrementante che chiave esterna.

Per legare un'entità dipendente alla sua entità principale, devi o valorizzare la chiave a mano con l'id dell'entità principale, oppure assegnare proprio l'entità principale alla proprietà di navigazione.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.