gpt4 book ai didi

c# - 使用 stub 实体更新实体关系的问题

转载 作者:行者123 更新时间:2023-11-30 22:48:46 26 4
gpt4 key购买 nike

编辑: Stub Entities Definition

我有两个实体类型 SubscriberAddOn

它们在数据模型中的定义如下

订户(#SubscriberID,名称,AddOnID)

加载项(#AddOnID,名称)

Subscriber 表中的 AddOnID 列引用 AddOn 表中的 AddOnID 列。


我正在尝试更新特定订阅者实体的插件引用。比方说,我想将 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,然后像以前一样对其进行更改。

这应该可以解决您的问题。

如您所见,调用刷新也有效...因为它会为您从数据库中获取引用的原始值。使用 Refresh 的缺点是它会向数据库发出查询。

所以像上面那样附加原始值只是保存了额外的查询。

希望对你有帮助

-亚历克斯

项目经理 Entity Framework 团队。

参见 my EF Tips series 的提示 26|获取更多信息。

关于c# - 使用 stub 实体更新实体关系的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1510902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com