【问题标题】:EntityFramework: Remove m2m association given only primary keys. How?EntityFramework:删除仅给定主键的 m2m 关联。如何?
【发布时间】:2012-11-23 19:07:06
【问题描述】:

我有两个实体 a 和 b 以及它们之间的 m2m 关联。实体 a 和 b 加载到我的 DbContext 中,而 m2m 关联没有。现在,在我的程序中,我知道 a 和 b 的主键,我需要删除 m2m 关联。

当然,我可以从数据库中重新加载 a 并包含它的 m2m 关联。但是,这需要额外往返数据库才能从数据库中获取实体。

我也可以先从 DbContext 中分离 a,然后将 b 添加到其 BSet,然后再次附加 a,然后调用 remove 类似:

context.Entry(a).State = EntityState.Detached;
a.Bset.Add(b)
context.Set(typeof(A)).Attach(a);
a.BSet.Remove(b)

但是,通过将 a 从其上下文中分离然后附加它,我失去了对 a 所做的更改。因此,调用 SaveChanges() 可能不会将 a 的所有更改持久化到数据库中。

我的问题是:我怎样才能删除 a 和 b 之间的 m2m 关联,而不需要额外往返数据库并且不丢失对 a 或 b 所做的任何更改?

[编辑:我正在寻找的是一种方法 a.BSet.Attach,它使我能够在 a en b 之间附加现有的 m2m 关联]

我正在使用最新版本的 Entity Framework,并且我正在使用 DbContext。

欢迎任何帮助。

PS。这是http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/5edea208-24cc-497b-8592-9cb025d558e4/的转贴

提前致谢,

梅林

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    几天前我遇到了同样的问题,我想出的解决方案是:

    context.Entry(a).State = EntityState.Detached;
    a.BSet.Add(b);
    context.Entry(a).State = EntityState.Modified;
    a.BSet.Remove(b);
    

    使用该代码,您应该删除 m2m 关联并保留对数据库的所有更改。

    编辑: 我刚刚意识到我们编写了几乎相同的代码,只需重新附加您的实体,将其状态更改为“已修改”。

    【讨论】:

    • 您好,感谢您的帮助。不幸的是,这确实适用于属性,但不适用于关联。特别是,当分离 a 时,新的 M2M 关系会消失。稍后将 a 的实体状态设置为 EntityState.Modified 时,它们不会返回。
    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多