我正在使用实体框架5.0。我正在修改我的应用程序从ObjectContext到DbContext模型。 DbContext应该按照微软推荐的方法。我使用数据库福斯特方法,并且我生成了模型表单数据库。 但是,在第一个简单的任务中就存在一个问题。即记录的简单更新被破坏。如何将部分更新操作从ObjectContext转换为DbContext
让我们有一个简单的表项,只有ilustration:
Item
(
ItemId int NOT NULL, -- Primary key
Name nvarchar(50) NOT NULL,
Description NVARCHAR(50)
)
我注意到,使用的DbContext不支持更新不作为的ObjectContext做了记录。 在我的应用程序中,我有一个简单的更新方法。
public void UpdateItem()
{
MyContext context = new MyContext();
Item item = new Item();
item.ItemId = 666;
context.Items.Attach(item);
// From this point onward EF tracks the changes I make to Item
Item.Description = "Some description";
context.SaveChanges();
}
使用ObjectContext此方法正确更新记录。使用SQL事件探查我可以看到,它产生这样的事情(大大简化了!!!)
UPDATE Item
SET Description = 'Some description'
WHERE ItemId = 666
但如果我尝试做的DbContext同样的事情,我得到异常:
System.Exception: Items.aspx.cs - logged from CustomError() ---> System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
并没有数据库更新发布到Sql服务器。 我想DbContext验证所有的属性和属性名称为null。这是通过设计。我不打算修改它,我甚至不知道它是什么,我不需要知道它是什么。 只有属性“说明”已更改。很明显,ObjectContext不能正确跟踪更改。 如何解决这个问题?
我研究了这个问题,并找到更新记录的东西。 例如此链接:https://stackoverflow.com/a/15339512/4601078
db.Users.Attach(updatedUser);
var entry = db.Entry(updatedUser);
entry.Property(e => e.Email).IsModified = true;
// other changed properties
db.SaveChanges();
但是,这是可怕的代码。对于每一个属性上应该添加一行:
entry.Property(e => e.Email).IsModified = true;
这会产生难看的不可读的代码,我怀疑LAMDA表达不在性能中柱。
更糟糕的是,那些打算往返数据库以获取所有已填写属性的现有记录,更新它和保存更改的人。在表演方面这是不合适的。
那么,如何处理简单的实体更新,或者这个DbContext只是微型收集死角的另一个项目,它们不是真正的目的?
我知道这是一个验证异常。验证本身(或跟踪)是错误的。 – f470071
对不起,更新答案。 –
嗯。您提供的链接可能与建议使用dbContext.Configuration.ValidateOnSaveEnabled = false的答案一致。虽然不是解决方案,但它至少是一种解决方法。我相信修改后的属性应该仍然有效。但这是一种解决方法,我在代码中进行更新前的验证。 Upvoted提供一半有用的链接和搜索短语“部分更新”。 – f470071