c# - 使用 stub 实体更新实体关系时出现问题

标签 c# entity-framework reference relation

编辑: Stub Entities Definition

我有两种实体类型订阅者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/

相关文章:

.net - 在 EF5 的 select select 子句中选择 null

c# - 当我通过我的存储库更新时,我的一个实体没有保存在 Entity Framework 中

c# - 引用 C# 中的引用

C# 枚举属性 null 与 0

c# - 在 C# 中将 byte 转换为 bool

c# - EF : Include navigation property to result of adding entity in DbSet

ajax - Microsoft.Ajax.Utilities dll : Missing Assembly, 从哪里下载?

ruby - 传递对方法的引用后,任何使用该引用的 mod 在方法外部都不可见 - Ruby?

c# - return ICollection 比 List 有什么优势

c# - 正则表达式来验证逗号分隔的电子邮件地址?