这似乎应该很明显,但是实体框架的某些内容让我感到困惑,我无法使其正常工作。
简单来说,我有三个表,其中Id值是自增列:
Users (userId, username)
Categories (categoryId, categoryName)
JoinTable (UserId, CategoryId) 复合主键
在实体设计器中(这是.NET 4.0),当我导入这些表时,如预期的那样,连接表不会出现,但是用户和类别显示了关系。以下代码:
var _context = new MyContext();
var myUser = new User();
myUser.UserName = "joe";
var myCategory = new Category();
myCategory.CategoryName = "friends";
_context.Users.AddObject(myUser);
myUser.Categories.Add(myCategory);
var saved = _context.SaveChanges();
返回错误(尽管未向数据库添加任何内容):
An item with the same key has already been added.
如果在保存之前添加以下内容:
_context.Categories.AddObject(myCategory);
myCategory.Users.Add(myUser);
我遇到了同样的错误,并且没有保存到数据库。如果在尝试关联它们之前保存myUser和myCategory对象,它们就都会被保存,但第二个保存操作会抛出错误,并且在join表中没有添加任何内容:
Cannot insert the value NULL into column 'UserId', table '...dbo.JoinTable'; column does not allow nulls. INSERT fails. The statement has been terminated.
我显然没有理解如何插入多对多关系。我错过了什么吗?