将新实体保存到数据库时出现问题。每当我保存新实体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!
}
请帮忙,因为我无法找到解决此问题的其他方法。我自己是一个实体框架新手。
答案 0 :(得分:1)
在此行var books = dbContext.Books.Include("Publisher")
中,您正在对数据库运行查询,并告知实体框架包含链接到所有图书的所有发布者。但是,数据库中没有与出版物链接的出版商。因此,上下文中的所有图书都将Publishers设置为null。
该行干扰了您的调试,现在又增加了混乱。
如果删除该行并返回原始错误,我认为您会发现该问题与尝试添加已存在的发布者有关。当你这样做时会发生这种情况:
book.Publisher = publisherRepository.Get(1);
bookRepository.Add(book);
Add
方法将整个图表(即Book
和Publisher
)标记为Added
,但发布服务器已存在于数据库中,因此不正确
您可以使用本书上的外键来避免此问题。像这样:
book.PublisherID = 1;
bookRepository.Add(book);
这里有一个关于这种行为的全面解释:
Why does entity framework reinsert existing objects into my database
答案 1 :(得分:0)
好的,删除导航属性上的[Required]属性会以某种方式删除错误。我仍然完全不明白为什么其他行会受到影响。