C# 使用实体框架更新部分实体的模式
我试图找到一种模式,我可以实现它,使用EntityFramework快速允许对实体进行部分更新。当我拥有完整的对象时,我可以使用Attach,但是如果我只进行部分更新,我希望找到一种方法以可重复的方式进行更新,而不必每次指定更改的属性 我发现了,我真的很喜欢它,但我正在努力使“原始值”和“当前值”不同,它们总是匹配的。我应该如何检索实体才能让这样的更新方法工作 我检索数据并使用它来填充页面上的信息(但用户只能更改/查看部分实体),因此我只能在回邮上获取部分实体信息-在这样更新之前,我是否必须检索并分离实体?我不能使用Try/UpdateModel,因为我没有在控制器中执行此工作。任何想法或替代模式都将不胜感激C# 使用实体框架更新部分实体的模式,c#,asp.net-mvc,entity-framework,repository-pattern,C#,Asp.net Mvc,Entity Framework,Repository Pattern,我试图找到一种模式,我可以实现它,使用EntityFramework快速允许对实体进行部分更新。当我拥有完整的对象时,我可以使用Attach,但是如果我只进行部分更新,我希望找到一种方法以可重复的方式进行更新,而不必每次指定更改的属性 我发现了,我真的很喜欢它,但我正在努力使“原始值”和“当前值”不同,它们总是匹配的。我应该如何检索实体才能让这样的更新方法工作 我检索数据并使用它来填充页面上的信息(但用户只能更改/查看部分实体),因此我只能在回邮上获取部分实体信息-在这样更新之前,我是否必须检索
public virtual void Update(T entity, params Expression<Func<T, object>>[] updatedProperties)
{
//Ensure only modified fields are updated.
var dbEntityEntry = DbContext.Entry(entity);
if (updatedProperties.Any())
{
//update explicitly mentioned properties
foreach (var property in updatedProperties)
{
dbEntityEntry.Property(property).IsModified = true;
}
}
else
{
//no items mentioned, so find out the updated entries
foreach (var property in dbEntityEntry.OriginalValues.PropertyNames)
{
var original = dbEntityEntry.OriginalValues.GetValue<object>(property);
var current = dbEntityEntry.CurrentValues.GetValue<object>(property);
if (original != null && !original.Equals(current))
dbEntityEntry.Property(property).IsModified = true;
}
}
}
公共虚拟无效更新(T实体,参数表达式[]updatedProperties)
{
//确保仅更新修改的字段。
var dbEntityEntry=DbContext.Entry(实体);
if(updatedProperties.Any())
{
//更新明确提到的属性
foreach(updateProperties中的var属性)
{
dbEntityEntry.Property(Property).IsModified=true;
}
}
其他的
{
//未提及任何项目,请查找更新的条目
foreach(dbEntityEntry.OriginalValues.PropertyNames中的var属性)
{
var original=dbEntityEntry.OriginalValues.GetValue(属性);
var current=dbEntityEntry.CurrentValues.GetValue(属性);
如果(原始!=null&&!原始.Equals(当前))
dbEntityEntry.Property(Property).IsModified=true;
}
}
}
看起来这可能是一个重复的问题。我找到了答案
要将更新的属性与数据库中的值进行比较,必须从数据库重新加载文档。一个例子:
public ActionResult Edit(Document document, bool sendEmail, string commentsTextBox)
{
if (ModelState.IsValid)
{
var documentInDB = docsDB.Documents.Single(d => d.Id == document.Id);
docsDB.Entry(documentInDB).CurrentValues.SetValues(document);
foreach (string propertyName in docsDB.Entry(documentInDB)
.OriginalValues.PropertyNames)
{
var OriginalValue = docsDB.Entry(documentInDB)
.OriginalValues.GetValue<object>(propertyName);
var NewValue = docsDB.Entry(documentInDB)
.CurrentValues.GetValue<object>(propertyName);
if (!OriginalValue.Equals(NewValue))
{
//capture the changes
}
}
}
}
public ActionResult编辑(文档文档、bool sendmail、字符串注释文本框)
{
if(ModelState.IsValid)
{
var documentInDB=docsDB.Documents.Single(d=>d.Id==document.Id);
docsDB.Entry(documentInDB).CurrentValues.SetValues(document);
foreach(docsDB.Entry(documentInDB)中的字符串propertyName)
.OriginalValues.PropertyNames)
{
var OriginalValue=docsDB.Entry(documentInDB)
.OriginalValues.GetValue(propertyName);
var NewValue=docsDB.Entry(documentInDB)
.CurrentValues.GetValue(propertyName);
如果(!OriginalValue.Equals(NewValue))
{
//捕捉变化
}
}
}
}
显然,要在业务层中实现,就像我试图实现的那样,您必须将数据库版本和更新的版本都传递到比较的方法中
我将在测试并获得一个工作示例后更新代码 为什么不使用jquary?我认为jquery无法解决我试图实现的问题。不管来自浏览器的是什么,我只会在对象/部分对象到达服务器后更新更改的属性。我仍然无法真正做到这一点。由于回发上的“new'd”对象,当前/原始值太不可预测。