如何在Entity Framework中添加或删除多对多关系?

Dan*_*mov 2 c# linq-to-entities many-to-many entity-framework entity-framework-4

有一个多对多的UserFeed表位于User和之间Feed,表示类似Twitter的关系.
它只有两个字段,形成一个复合键:UserIDFeedID.

我需要编写一个方法,根据布尔标志从订阅源订阅或取消订阅用户.

public void SetSubscriptionFlag (int userId, int storeId, bool subscribe)
{
}
Run Code Online (Sandbox Code Playgroud)

我是Entity Framework的新手,所以我试图找到并遵循"EF-ish"方式来实现这一目标.

我最初的想法是:

  • UserFeed我应该创建一个多对多的Subscriptions属性(编辑:这里的命中限制),而不是与中产阶级合作;
  • 在我这样做之后,我需要User通过ID 获取一个实例,检查它是否Feed在其中给出Subscriptions并根据标志和当前存在添加/删除它;
  • 在检查和添加/删除之前有一段时间间隔并且用户设法提交两个添加或删除请求时,弄清楚如何避免竞争冲突;
  • 优化我的代码,以避免不必要的SELECT,如果有的话,因为我真正想做的只是一个SELECT和单个INSERT/DELETE.

相关的代码片段和对我的观点的评论非常感谢.

谢谢!

Lad*_*nka 7

你可以使用虚拟对象 - 它肯定适用于插入,我希望它也可以用于删除:

建立新关系:

var user = new User() { Id = userId };
context.Users.Attach(user);
var store = new Store() { Id = storeId };
context.Stores.Attach(store);

// Now context trackes both entities as "existing"
// and you can build a new relation
user.Subscriptions.Add(store);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

删除现有关系:

var user = new User() { Id = userId };
var store = new Store() { Id = storeId };
user.Subscriptions.Add(store);
context.Users.Attach(user);

// Now context trackes both entities as "existing"
// with "existing" relation so you can try to remove it
user.Subscriptions.Remove(store);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

  • @bsnote:你应该创建另一个问题(如果它可以帮助你制定问题,可能会引用这个问题). (2认同)