这些是我的实体:

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并找到this。但是我不知道该怎么办。

最佳答案

我认为问题出在以下代码块中:

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

在这里,您将创建一个新的CurrencyPrice并将其分配给Currency,从而孤立了以前分配给该CurrencyPriceCurrency对象。现在,该对象仍在数据库中,但没有父对象。因此,EntityFramework希望将此CurrencyPrice上的父代ID设置为NULL,这样数据库就可以避免导致您引用的错误。我已经在this answer中发布了关于此问题的更详细的解释。

为防止这种情况,请在添加新的CurrencyPrice之前从数据库中删除它。另外,由于CurrencyPrice对象似乎总是依赖于它们的Currency父对象,因此您可以考虑使它成为一种识别关系。我已经在Implementing identifying relationships with EF4解释了如何使用EntityFramework 4 Model First创建它们。我尚未使用Code First,但是方法应该相似。

关于c# - 操作失败: The relationship could not be changed because one or more of the foreign-key properties is non-nullable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17358293/

10-12 19:59