【发布时间】:2014-02-20 10:09:48
【问题描述】:
给定实体:Topics 和 Subscriptions 具有多对多关系以及相应的表:Topics、Subscriptions、TopicsSubscriptions,我只想从 TopicsSubscriptions 中删除一行EF,但不加载任何额外数据(可能只有 1 个主题和 1 个订阅除外)。
最后我希望 EF 生成与此类似的 SQL:
exec sp_executesql N'delete [dbo].[TopicSubscriptions]
where (([TopicId] = @0) and ([SubscriptionId] = @1))',N'@0 int,@1 int',@0=1,@1=2
我将LazyLoading 设置为false。
我想我可以从这里得到答案:How to delete many-to-many relationship in Entity Framework without loading all of the data。
var db = new TopicDBEntities(); var topic = db.Topics.FirstOrDefault(x => x.TopicId == 1); // Get the subscription you want to delete var subscription = db.Subscriptions.FirstOrDefault(x => x.SubscriptionId == 2); // !!! This line does not work for me (Attach to ICollection<> ?!?) !!! topic.Subscriptions.Attach(subscription); // Attach it (theObjectContext now 'thinks' it belongs to the topic) topic.Subscriptions.Remove(subscription); // Remove it db.SaveChanges(); // Flush changes
但后来我意识到 Attach 方法不属于 ICollection<>... 除非我遗漏了什么。
仅将一个订阅附加到一个主题的想法听起来不错,但我不明白如何实现它。
我使用的是DbContext 而不是ObjectContext 和Entity Framework 6,但我想应该没关系。
编辑:如果可能的话,最好找到一个没有存储过程或直接 sql 的解决方案,因为我必须在我的应用程序中支持许多数据库后端。
如果我不够清楚,我不需要删除实体,我只需要删除它们之间的关联。
【问题讨论】:
-
如果您不想要下面的任何解决方案,那么您需要在表中添加一个 Payload 列,以便它在 EF 中映射并且可以引用为
dbContext.TopicSubscriptions。但是,这意味着您使用不必要的空间在表上使用了不必要的数据。除此之外,我不相信你有其他选择。 -
我要注意上面的,它会影响你现有的代码。到什么程度,只有你自己知道。
-
也许我的问题不够清楚,我只能从 db 加载一个特定主题和一个特定订阅,尽管我猜这些也可以附加到 DbSet。
-
在您链接的问题中,dannie.f 的答案是一个可行的解决方案:stackoverflow.com/a/15294368/270591
-
正是我刚刚尝试过的,并且工作起来就像一个魅力......谢谢
标签: c# entity-framework many-to-many dbcontext