实体框架更新对象和更改引用
问题描述:
我试图更新CustomerRailcard对象,该对象在Railcard对象上有一个引用,其结尾*为1。问题是,我无法删除Railcard对象,只能更改引用将CustomerRailcard对象指向另一个RailcardObject。 我在做这样的:实体框架更新对象和更改引用
UPDATE:
// Updating properties in existing CustomerRailcard.
// This won't update navigation properties (Railcard).
context.ObjectStateManager.ChangeObjectState(existingCustomerRailcard, EntityState.Modified);
context.ApplyCurrentValues("CustomerRailcardsDbo", newCustomerRailcard);
// Now I'm trying to update navigation property of CustomerRailcard to the Railcard
// by removing the reference from old Railcard to CustomerRailcard.
// Railcard can have references to many CustomerRailcards.
var oldRailcard = railcardRepository.FindById(customerDetails.CustomerRailcards.FirstOrDefault(r => r.Id == railcard.Id).Railcard.Id);
var customerRailcardToRemove = oldRailcard.CustomerRailcards.FirstOrDefault(cr => cr.Id == railcard.Id);
// Removing reference to CustomerRailcard from Railcard
oldRailcard.CustomerRailcards.Remove(customerRailcardToRemove);
// Now I'm getting new Railcard I want to have referenced by CustomerRailcard
// and I'm changing its reference tu CustomerRailcard
var newRailcard = railcardRepository.FindById(railcard.Railcard.Id);
// Adding reference to CustomerRailcard
newRailcardDboReference.CustomerRailcards.Add(railcard);
运行在这之后,我会得到这个错误
从“CR_RL_FK” AssociationSet的关系是“被删除”状态。考虑到多重性约束,相应的'CustomerRailcardDbo'也必须处于'已删除'状态。
我该如何执行这种关系的更新?
答
仅从导航属性中删除customerReilcardToRemove
是不够的 - 比只打破关系,但不会删除CustomerReilcard
实例。您的关系要求CustomerReilcard
有一个主体Reilcard
,因此您必须通过调用DeleteObject
来删除customerReilcardToRemove
实例,或者将关系设为空并保留孤立实例。
但DeleteObject会从数据库中物理删除对象。我需要以某种方式只改变对另一个铁路卡的参考。 – LadislavM 2012-08-14 09:06:44
你的代码太复杂了,我无法理解你想做什么。简单地说,如果您从主体导航属性中删除依赖实体,则必须将相同实体添加到其他主体,否则您将得到异常。你的代码是imho只从导航属性中删除实体,但不能将其插入另一个实体。 – 2012-08-14 09:34:04
我已更新代码及其评论。我希望现在更清楚。基本上我所拥有的是一张名为Railcards的铁路卡,其中包含铁路卡名称和其他内容,这是不可改变的。我无法删除或更改任何内容。然后,我有第二张名为CustomerRailcard的表格,其中每个客户铁路卡都参考铁路卡表中的铁路卡。当我执行更新时,我试图仅将客户铁路卡中的引用从一个铁路卡更改为另一个。我会感谢任何帮助。 – LadislavM 2012-08-14 10:39:34