2013-06-28 16 views
5

sind meine Einheiten sind:Der Vorgang ist fehlgeschlagen: Die Beziehung konnte nicht geändert werden, da eine oder mehrere der Fremdschlüsseleigenschaften ist nicht-nullable

public class Currency : Exchange 
{ 
    public List<CurrencyPrice> CurrencyPrice { get; set; } 
} 

public class CurrencyPrice : Price 
{ 
    public int CurrencyId { get; set; } 
    [ForeignKey("CurrencyId")] 
    public Currency Currency { get; set; } 
} 

Das erste Mal, dass ich einen Wert in das DB alles einfügen wenn ich einen Wert in der DB ist in Ordnung, aber ändern und versuchen, den Datensatz einfügen oder aktualisieren erhalte ich diese Fehlermeldung:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

das ist mein Insert Code:

var currency = 
    UnitOfWork.Exchange.Get(x => x is Currency && x.ExchangeType.Id == exchangeTypeId) as Currency; 
if (currency != null) 
{ 
    CurrencyPrice lastPriceValue = UnitOfWork.CurrencyPrice.Last(x => x.CurrencyId == currency.Id); 
    if (lastPriceValue == null || lastPriceValue.Value != price) 
    { 
     currency.CurrencyPrice = new List<CurrencyPrice> 
      { 
       new CurrencyPrice {Id = Guid.NewGuid().ToString(), EntryDate = DateTime.Now, Value = price,CurrencyId = currency.Id,Currency = currency} 
      }; 
    } 
    else 
    { 
     lastPriceValue.EntryDate = DateTime.Now; 
    } 

    UnitOfWork.Commit(); 
} 

Ich suchte StackOverflow und gefunden this. Aber ich verstehe nicht, was ich tun muss.

Antwort

10

ich glaube, das Problem in diesem Code-Block liegt:

currency.CurrencyPrice = new List<CurrencyPrice> 
{ 
    new CurrencyPrice {Id = Guid.NewGuid().ToString(), EntryDate = DateTime.Now, Value = price,CurrencyId = currency.Id,Currency = currency} 
}; 

Hier können Sie einen neuen CurrencyPrice erstellen und Zuweisen zu einem Currency, wodurch verwaisen die CurrencyPrice Objekt, das vor dieser Currency zugewiesen wurde. Dieses Objekt befindet sich jetzt noch in der Datenbank, aber ohne ein übergeordnetes Objekt. Daher möchte EntityFramework die ID des übergeordneten Elements auf dieser CurrencyPrice auf NULL setzen, die die Datenbank verhindert, was zu dem von Ihnen angegebenen Fehler führt. Ich habe eine ausführlichere Erklärung dieses Problems in this answer veröffentlicht.

Um dies zu verhindern, entfernen Sie die alte CurrencyPrice aus Ihrer Datenbank, bevor Sie die neue hinzufügen. Alternativ, da es scheint, dass CurrencyPrice Objekte immer auf ihre Currency Eltern abhängen, könnten Sie darüber nachdenken, dies zu einer identifizierenden Beziehung zu machen. Ich habe erklärt, wie man sie mit EntityFramework 4 Model First unter Implementing identifying relationships with EF4 erstellt. Ich habe noch nicht mit Code First gearbeitet, aber der Ansatz sollte ähnlich sein.

+0

Sehr schöne Erklärung. Danke. –

0

Hatte denselben Fehler beim Speichern von Änderungen im Kontext und hat keine Änderungen an Entitäten oder Beziehungen vorgenommen.

Fehler war, weil einige Entitäten GetHashCode() Methode ovveridden hatte.

Verwandte Themen