我有两种实体类型订阅者和AddOn
它们在数据模型中的定义如下
订阅者(#SubscriberID,名称,AddOnID)
AddOn(#AddOnID,名称)
订阅者表中的 AddOnID 列引用 AddOn 表中的 AddOnID 列。
我正在尝试更新特定订阅者实体的 AddOn 引用。 可以说,我想将 Subscriber#1 的 AddOn 引用更改为 AddOn#5。代码如下:
Subscriber subscriber = new Subscriber { SubscriberID = 1};
AddOn newAddOn = new AddOn { AddOnID = 5};
using (var context = new TestEntities())
{
context.AttachTo("AddOn", newAddOn);
context.AttachTo("Subscriber", subscriber);
subscriber.Name = "dummy";
subscriber.AddOn = newAddOn;
context.SaveChanges();
}
这会在“context.SaveChanges();”行中引发异常
A relationship is being added or deleted from an AssociationSet 'FK-Subscriber-AddOn'. With cardinality constraints, a corresponding 'Subscriber' must also be added or deleted.
当我注释掉“subscriber.AddOn = newAddOn;”行时,更新操作工作得很好。
那么,为什么我不能像更新非引用属性那样更新引用属性?
注意:我不知道这是否是正确的方法,但添加“context.Refresh(RefreshMode.StoreWins,subscriber);”或“context.Refresh(RefreshMode. CLIetWins,subscriber);"在附加语句之后使事情正常工作。
为什么会出现这种行为?
最佳答案
在 EF 3.5 SP1 中,您无法在不知道原始值的情况下修改引用(即subscriber.Addon)。请注意,此限制将在 EF 4 if you use FK Associations 中消失。 .
现在大多数时候 EF 都会向您隐藏这种额外的复杂性,但当您像这样使用 Attach 时就不会了。
这是您需要的代码:
AddOn newAddOn = new AddOn { AddOnID = 5};
AddOn oldAddOn = new AddOn { AddOnID = 4}; // you need to remember the old id.
Subscriber subscriber = new Subscriber { SubscriberID = 1, AddOn = oldAddOn};
using (var context = new TestEntities())
{
context.AttachTo("AddOn", newAddOn);
context.AttachTo("Subscriber", subscriber); // will attach the oldAddOn too
subscriber.Name = "dummy";
subscriber.AddOn = newAddOn;
context.SaveChanges();
}
如您所见,我们只是告诉 EF 原始关系,然后像以前一样更改它。
这应该可以解决您的问题。
正如您发现的那样,调用刷新也有效...因为它会为您从数据库中获取引用的原始值。使用刷新的缺点是它会向数据库发出一个查询。
因此,像上面那样附加原始值只会节省额外的查询。
希望这有帮助
-亚历克斯
Entity Framework 团队项目经理。
请参阅 my EF Tips series 的提示 26了解更多信息。
关于c# - 使用 stub 实体更新实体关系时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1510902/