多对多关系插入
Many to many relationship inserts
我有两个类,例如:
class A {
public virtual ICollection<B> BList { get; set; }
}
class B {
public virtual ICollection<A> AList { get; set; }
}
Entity Framework 然后创建 A 和 B tables 以及连接它们的 AB table。
在我的应用程序中,我得到 A_ID
和 B_ID
,我需要在 A 和 B 之间建立连接。
我所做的是通过 ID 获取 A,然后通过 ID 获取 B,然后执行 A.BList.Add(BObject)
,但这是 3 次数据库访问,2 次获取 + 1 次插入。
在 Entity Framework 中有什么方法可以在一次数据库访问中完成吗?
更新:
看了Martin提供的link,写了一个简单的例子:
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时抛出异常...
也许你可以恢复你的代码并试试这个:
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 class 构造函数[=20] 中向 Books 用户集合添加一个 初始化程序=].
您需要在实体的构造函数中初始化集合导航属性:
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();
这将在一次数据库访问中插入三行
我有两个类,例如:
class A {
public virtual ICollection<B> BList { get; set; }
}
class B {
public virtual ICollection<A> AList { get; set; }
}
Entity Framework 然后创建 A 和 B tables 以及连接它们的 AB table。
在我的应用程序中,我得到 A_ID
和 B_ID
,我需要在 A 和 B 之间建立连接。
我所做的是通过 ID 获取 A,然后通过 ID 获取 B,然后执行 A.BList.Add(BObject)
,但这是 3 次数据库访问,2 次获取 + 1 次插入。
在 Entity Framework 中有什么方法可以在一次数据库访问中完成吗?
更新:
看了Martin提供的link,写了一个简单的例子:
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时抛出异常...
也许你可以恢复你的代码并试试这个:
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 class 构造函数[=20] 中向 Books 用户集合添加一个 初始化程序=].
您需要在实体的构造函数中初始化集合导航属性:
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();
这将在一次数据库访问中插入三行