5

这些是我的实体:

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

我第一次将值插入数据库时​​一切正常,但如果我更改数据库中的任何值并尝试插入或更新记录,我会收到此错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

这是我的插入代码:

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

我搜索了 StackOverflow 并找到了这个。但我不明白我必须做什么。

4

2 回答 2

10

我认为问题在于这个代码块:

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

在这里,您创建一个 newCurrencyPrice并将其分配给 a Currency,从而使之前CurrencyPrice分配给 this 的对象成为孤立对象Currency。该对象现在仍在数据库中,但没有父对象。因此,EntityFramework 想要在此设置父 ID,CurrencyPrice数据库会NULL阻止该 ID 导致您引用的错误。我在这个答案中发布了这个问题的更详细的解释。

CurrencyPrice为防止这种情况,请在添加新数据库之前从数据库中删除旧数据库。或者,由于对象似乎CurrencyPrice总是依赖于它们的Currency父对象,您可能会考虑将其作为识别关系。我已经在实现与 EF4 的识别关系中解释了如何使用 EntityFramework 4 Model First 创建它们。我还没有使用过 Code First,但方法应该类似。

于 2013-06-28T06:19:20.407 回答
0

在上下文中保存更改时出现相同的错误,并且没有对实体或关系进行任何更改。

错误是因为某些实体具有 GetHashCode() 方法 ovveridden

于 2014-10-01T08:51:26.130 回答