多对多的关系插入

时间:2015-10-08 17:49:46

标签: 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; }
}

实体框架然后创建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时抛出异常...

2 个答案:

答案 0 :(得分:4)

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

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();

即将在一次数据库旅行中插入三行

答案 1 :(得分:1)

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

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);

要解析空指针,需要在代码或用户类构造函数中添加初始化程序到Books 用户集合。

相关问题