c# - 多对多关系插入

标签 c# asp.net entity-framework many-to-many

我有两个类,例如:

class A {
    public virtual ICollection<B> BList { get; set; }
}

class B {
    public virtual ICollection<A> AList { get; set; }
}

Entity Framework 然后创建 A 和 B 表以及连接它们的 AB 表。

在我的应用程序中,我得到了 A_IDB_ID,我需要在 A 和 B 之间建立连接。

我所做的是通过 ID 获取 A,然后通过 ID 获取 B,然后执行 A.BList.Add(BObject),但这是 3 次数据库访问,2 次获取 + 1 次插入。

Entity Framework 有没有办法在一次数据库访问中完成它?

更新:

我查看了 Martin 提供的链接,并写了一个简单的例子:

User user = new User { ID = 12135 };
Book book = new Book { ID = 1};

context.Users.Attach(user);
context.Books.Attach(book);

user.Books.Add(book);  

context.SaveChanges();

但是我在 user.Books.Add(book); 处得到空指针异常 user.Books 为空,并且在调用 Add 时抛出异常...

最佳答案

您需要在实体的构造函数中初始化您的集合导航属性:

public class A {
    public A()
    { 
       BList=new List<B>();
    }
    public virtual ICollection<B> BList { get; set; }
}

B 实体执行相同的操作。

此外,您不需要在开始时附加新实体,要保存它们,您可以这样做:

  User user = new User { ID = 12135 };
  Book book = new Book { ID = 1};

  user.Books.Add(book);  
  context.Users.Add(user);
  context.SaveChanges();

这将在一次数据库访问中插入三行

关于c# - 多对多关系插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33022693/

相关文章:

c# - 启动 Internet Explorer 进行调试

c# - Entity Framework 记录重复项

c# - 如何获取 HttpRuntime.Cache 对象的缓存项优先级?

javascript - 如何在 cookie Javascript 中赋值

asp.net - Application Insights 快照调试器 : Snapshots are not being pushed from a . NET 完整框架站点

c# - 在 lambda 表达式中声明文字日期

c# - 用 RegEx 和 C# 替换文本没有按照我需要的方式工作

c# - LINQ 和 SQL 中看似等效的查询返回不同的结果

c# - 在 MVC 中将 ASP.NET Identity 与我自己的实体结合使用

c# - 提供者未返回ProviderManifestToken字符串 Entity Framework