操作失败:无法更改关系,因为一个或多个外键属性不可为空
这些是我的实体:
public class Currency : Exchange { public List 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 { new CurrencyPrice {Id = Guid.NewGuid().ToString(), EntryDate = DateTime.Now, Value = price,CurrencyId = currency.Id,Currency = currency} }; } else { lastPriceValue.EntryDate = DateTime.Now; } UnitOfWork.Commit(); }
我搜索了StackOverflow并找到了这个 。 但我不明白我该做什么。
我认为问题出在这个代码块中:
currency.CurrencyPrice = new List { new CurrencyPrice {Id = Guid.NewGuid().ToString(), EntryDate = DateTime.Now, Value = price,CurrencyId = currency.Id,Currency = currency} };
在这里,您可以创建一个新的CurrencyPrice
并将其分配给Currency
,从而孤立分配给此Currency
的CurrencyPrice
对象。 此对象现在仍在数据库中,但没有父对象。 因此,EntityFramework希望将此CurrencyPrice
上的父ID设置为NULL
,数据库会阻止该ID导致您引用的错误。 我在这个答案中发布了这个问题的更详细的解释。
要防止这种情况,请在添加新的CurrencyPrice
之前从数据库中删除旧的CurrencyPrice
。 或者,由于看起来CurrencyPrice
对象总是依赖于其Currency
父级,因此您可以考虑将其设置为标识关系。 我已经解释了如何使用EntityFramework 4 Model First在实现与EF4的识别关系时创建它们。 我还没有使用Code First,但方法应该类似。
保存上下文更改时出现相同的错误,并且未对实体或关系进行任何更改。
错误是因为某些实体具有ovveridden的GetHashCode()方法 。
- WPF中的树视图级别?
- ASP.NET MVC – 来自控制器代码的当前动作?
- C#和Google Checkout – 从服务器获取回复?
- Nlog给出exception可能的解释是缺少零arg和单个arg Common.Logging.Configuration.NameValueCollection构造函数
- 如何从Entity Framework / LINQ中的特定表中提取元组列表?
- 在C#中,有一种方法可以使用reflection检索内置数据类型属性
- Graphics CopyFromScreen方法如何复制到位图?
- 使用先前生成的带有.net框架的RSA公钥/私钥
- 简单的跨平台流程来处理Mono中的通信?