1

将新实体保存到数据库时出现问题。每当我保存新实体DbEntityValidationException时就会发生。但是仔细查看变量的值和我实体的数据注释,我都遇到了。

我查看了数据库,问题似乎不在我要添加的实体上,而是在数据库中保存的先前实体上。出于某种原因,在添加实体之前以前具有值的一些外键字段现在为 NULL!

在调试过程中,我扫描了所有这些实体,在调用SaveChanges()方法之前,这些字段都存在且不为空。然后在调用之后SaveChanges(),发生验证错误,因为我认为SaveChanges()可能做了一些使其他记录混乱的事情。

我不知道这是否与它有关,但是当我创建一个新实体时,我会创建它的一个新实例并单独分配它的属性。它的一些属性来自实体框架并附加。所以我将一个附加属性分配给一个分离的新对象。我不知道这是否导致了奇怪的行为。这是一个示例摘录:

Book book = new Book();
book.Title = "The FooBar";
book.Publisher = publisherRepository.Get(1); // will retrieve a Publisher object from EF

bookRepository.Add(book);

....

// under BookRepository class
public void Add(Book book)
{
   dbContext.Books.Add(book);
   // just to check if the other records are not messed up, I did this and
   // check the values in VS Debugger
   // At this point, the other records are not yet affected.
   var books = dbContext.Books.Include("Publisher").ToArray();

   dbContext.SaveChanges(); // error thrown here, 
   // checking at the validation error, other book 
   //instances have their Publisher property set to NULL!
}

请帮忙,因为我找不到解决此问题的其他方法。我自己是一个实体框架新手。

4

2 回答 2

1

在这一行var books = dbContext.Books.Include("Publisher")中,您正在对数据库运行查询并告诉实体框架包括链接到所有书籍的所有发布者。但是数据库中还没有与书籍相关联的出版商。因此,上下文中的所有书籍都将 Publishers 设置回 null。

那条线干扰了您的调试,现在正在增加混乱。

如果您删除该行并返回原始错误,我认为您会发现问题与尝试添加已存在的发布者有关。当你这样做时会发生这种情况:

book.Publisher = publisherRepository.Get(1);
bookRepository.Add(book);

Add方法将整个图形(即BookPublisher)标记为Added,但 Publisher 已存在于数据库中,因此这是不正确的。

您可以通过在 Book 上使用外键来避免该问题。像这样:

book.PublisherID = 1;
bookRepository.Add(book);

这里有对这种行为的全面解释:

为什么实体框架将现有对象重新插入我的数据库

于 2013-10-28T09:48:49.387 回答
0

好的,删除导航属性上的 [Required] 属性以某种方式消除了错误。我仍然完全不明白为什么其他行会受到影响。

于 2013-10-28T11:31:22.480 回答