多对多关系插入

本文关键字:插入 关系 | 更新日期: 2023-09-27 18:16:59

我有两个类,例如:

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

实体框架然后创建A和B表以及连接它们的AB表。

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

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

是否有任何方法在实体框架做它在一个数据库之旅?

更新:

我看了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();

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

也许你可以恢复你的代码,并尝试这个:

User user = new User { 
                       ID = 12135 , 
                       Books = new ICollection<Book>() { new Book { ID = 1} } 
                     };
context.Users.Attach(user);

或:

User user = new User { ID = 12135 };
Book book = new Book { ID = 1};
context.Users.Attach(user);
context.Books.Attach(book);
user.Books = new ICollection<Book>();
user.Books.Add(book);

要解决空指针期望,需要在代码中或 user类构造函数中为Books用户集合添加初始化式。