Una proprietà dipendente in un ReferentialConstraint è mappata a una colonna generata dal negozio

Ottengo questo errore durante la scrittura nel database:

Una proprietà dipendente in un ReferentialConstraint è mappata a una colonna generata dal negozio. Colonna: “PaymentId”.

public bool PayForItem(int terminalId, double paymentAmount, eNums.MasterCategoryEnum mastercategoryEnum, int CategoryId, int CategoryItemId) { using (var dbEntities = new DatabaseAccess.Schema.EntityModel()) { int pinnumber = 0; long pinid = 1; //getPinId(terminalId,ref pinnumber) ; var payment = new DatabaseAccess.Schema.Payment(); payment.CategoryId = CategoryId; payment.ItemCategoryId = CategoryItemId; payment.PaymentAmount = (decimal)paymentAmount; payment.TerminalId = terminalId; payment.PinId = pinid; payment.HSBCResponseCode = ""; payment.DateActivated = DateTime.Now; payment.PaymentString = "Payment"; payment.PromotionalOfferId = 1; payment.PaymentStatusId = (int)eNums.PaymentStatus.Paid; //payment.PaymentId = 1; dbEntities.AddToPayments(payment); dbEntities.SaveChanges(); } return true; } 

Lo schema è:

inserisci la descrizione dell'immagine qui

È ansible che tu abbia definito una ctriggers relazione tra le tue tabelle? colonne diverse e una era impostata come autonumerica.

È successo a me.

Questo errore indica che stai utilizzando una relazione non supportata o che hai un errore nella mapping. Probabilmente il tuo codice non è assolutamente correlato all’errore.

L’errore indica che si ha una relazione tra entity framework in cui la proprietà della chiave esterna nell’ quadro dipendente è definita come archivio generato. Le proprietà generate del negozio sono state inserite nel database. EF non supporta le proprietà generate dal negozio come chiavi esterne (così come le proprietà calcolate nelle chiavi primarie).

Ho avuto lo stesso problema. Sulla base delle risposte fornite qui sono stato in grado di rintracciarlo e risolverlo, ma ho avuto uno strano problema descritto di seguito: potrebbe aiutare qualcuno in futuro.

Sulle mie tabelle dipendenti, le colonne Chiave esterna sono state impostate su StoreGeneratedPattern = “Id quadro”. Ho dovuto cambiarlo in “Nessuno”. Sfortunatamente, farlo all’interno del designer non ha funzionato affatto.

Ho esaminato l’XML generato dal designer (SSDL) e queste proprietà erano ancora presenti, quindi le ho rimosse manualmente. Ho anche dovuto correggere le colonne sul database (rimuovere Identity (1,1) da CREATE TABLE SQL)

Dopo ciò, il problema è andato via.

Ho avuto lo stesso problema e dopo aver scavato nel design di una tabella in SQL Server, ho scoperto che erroneamente ho impostato la chiave primaria della tabella anche come chiave esterna.

flusso di progettazione della tabella server SQL

In questa immagine puoi vedere che JobID è la chiave primaria della tabella ma anche erroneamente la chiave esterna.

Se hai controllato i tuoi rapporti e stai bene lì.

Elimina la tabella in edmx e quindi aggiorna dal database. Questo ti farà risparmiare l’aggiornamento manuale.

Per me è stata una chiave straniera posizionata in modo errato nel tavolo, ma anche dopo aver modificato il tavolo per sistemarlo, non funzionava ancora. È necessario aggiornare i file EDMX (e non abbastanza per “aggiornare” la tabella dal modello, è necessario rimuovere e aggiungere nuovamente la tabella nel modello).

Ricontrolla la relazione tra Pagamento e le altre tabelle / entity framework. Compresi quelli che non dovrebbero contenere PaymentId perché è lì che il problema si nasconde molto probabilmente.

Quando si creano chiavi esterne in SQL Server Management Studio, la chiave primaria è predefinita e questo valore predefinito viene ripristinato quando viene modificata la tabella padre, pertanto fare attenzione a modificare i valori nell’ordine corretto nella finestra “Tabelle e colonne”.

Inoltre, dopo aver risolto la relazione problematica, c’è una buona probabilità che un semplice “Refresh” sul modello non rimuova correttamente la relazione erronea dal modello e riceverai lo stesso errore anche dopo la ” correzione “, quindi fallo tu stesso nel modello prima di eseguire un aggiornamento. (L’ho imparato a mie spese.)

Oltre alla risposta accettata, se si utilizza il generatore POCO inverso EF o qualche altro strumento che genera i POCO, assicurarsi di rigenerarli !

Nel mio caso il problema è stato causato dall’avere una relazione a due vie 1-1:

 class Foo{ [Key] Id [ForeignKey] BarId ... } class Bar{ [Key] Id [ForeignKey] FooId ... } 

Dovevo semplicemente rimuovere una delle due chiavi esterne (non è necessario comunque).

Nel mio caso era semplicemente che non avevo le autorizzazioni impostate correttamente sul database. Avevo letto solo set e Entity framework mi dava un errore ReferentialConstraint che mi ha buttato fuori. Aggiunti ulteriori permessi di scrittura e tutto andava bene.

Nel mio caso, avevo una proprietà generata dal database e una proprietà di navigazione ForeignKey impostata per fare riferimento a una tabella correlata 1 a 1.

Non era qualcosa che potevo rimuovere, avevo bisogno di essere in grado sia di impostare la chiave primaria dell’ quadro per essere generata dal database E avevo bisogno di essere in grado di fare riferimento alla tabella 1 a 1 come proprietà di navigazione.

Non sono sicuro se questo è uguale per gli altri, ma questo problema si presentava solo quando la creazione di una nuova entity framework, la lettura o la modifica di quadro esistenti non mostravano il problema, quindi ho risolto il problema creando una versione ereditata del mio Contesto e usando il metodo Fluent per distriggersre la proprietà di navigazione durante la creazione.

Quindi, la mia quadro originale assomigliava a questo:

 public partial class MyEntity { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid id{ get; set; } // Navigation [ForeignKey("id")] public PathEntity Path { get; set; } } 

Così ho creato uno speciale contesto ereditato simile a questo:

  private class _navPropInhibitingContext : EF.ApplicationDBContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .Ignore(e => e.Path); } } 

e poi ha cambiato il codice che ha creato la nuova entity framework per rendere l’utente del nuovo tipo di contesto

  using (var specialContext = new _navPropInhibitingContext()) { var dbModel = new MyEntity() { ... }; specialContext.MyEntity.Add(dbModel); await specialContext.SaveChangesAsync(); } 

Spero che questo aiuti qualcuno