添加新实体时出现奇怪错误

时间:2013-10-28 08:48:29

标签: c# asp.net-mvc entity-framework

将新实体保存到数据库时出现问题。每当我保存新实体DbEntityValidationException时。但仔细查看变量的值和我的实体的数据注释,我遇到了所有这些。

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

在调试期间,我扫描了所有这些实体,在我调用SaveChanges()方法之前,这些字段在那里而不是null。然后在调用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!
}

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

2 个答案:

答案 0 :(得分:1)

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

该行干扰了您的调试,现在又增加了混乱。

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

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

Add方法将整个图表(即BookPublisher)标记为Added,但发布服务器已存在于数据库中,因此不正确

您可以使用本书上的外键来避免此问题。像这样:

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

这里有一个关于这种行为的全面解释:

Why does entity framework reinsert existing objects into my database

答案 1 :(得分:0)

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