user1968030
user1968030

Reputation:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable

These are my entities:

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; }
}

The first time I insert a value into the DB everything is OK but if I change any value in the DB and try to insert or update the record I get this error:

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.

This is my 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();
}

I searched StackOverflow and found this. But I don't understand what I have to do.

Upvotes: 5

Views: 11385

Answers (2)

Antoine Meltzheim
Antoine Meltzheim

Reputation: 9934

Had same error when saving changes on the context, and didn't made any changes to entities or relationships.

Error was because some entities had GetHashCode() method ovveridden.

Upvotes: 0

Chris
Chris

Reputation: 7184

I think the problem lies in this code block:

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

Here you create a new CurrencyPrice and assign it to a Currency, thereby orphaning the CurrencyPrice object that was assigned to this Currency before. This object is now still in the database, but without a parent. Thus EntityFramework wants to set the parent's ID on this CurrencyPrice to NULL which the database prevents resulting in the error you quoted. I have posted a more detailed explanation of this problem in this answer.

To prevent this, remove the old CurrencyPrice from your database before adding the new one. Alternatively, since it seems that CurrencyPrice objects always depend on their Currency parent, you might consider making this an identifying relationship. I have explained how to create them with EntityFramework 4 Model First at Implementing identifying relationships with EF4. I have not worked with Code First yet, but the approach should be similar.

Upvotes: 10

Related Questions