C# 使用实体框架更新部分实体的模式

C# 使用实体框架更新部分实体的模式,c#,asp.net-mvc,entity-framework,repository-pattern,C#,Asp.net Mvc,Entity Framework,Repository Pattern,我试图找到一种模式,我可以实现它,使用EntityFramework快速允许对实体进行部分更新。当我拥有完整的对象时,我可以使用Attach,但是如果我只进行部分更新,我希望找到一种方法以可重复的方式进行更新,而不必每次指定更改的属性 我发现了,我真的很喜欢它,但我正在努力使“原始值”和“当前值”不同,它们总是匹配的。我应该如何检索实体才能让这样的更新方法工作 我检索数据并使用它来填充页面上的信息(但用户只能更改/查看部分实体),因此我只能在回邮上获取部分实体信息-在这样更新之前,我是否必须检索

我试图找到一种模式,我可以实现它,使用EntityFramework快速允许对实体进行部分更新。当我拥有完整的对象时,我可以使用Attach,但是如果我只进行部分更新,我希望找到一种方法以可重复的方式进行更新,而不必每次指定更改的属性

我发现了,我真的很喜欢它,但我正在努力使“原始值”和“当前值”不同,它们总是匹配的。我应该如何检索实体才能让这样的更新方法工作

我检索数据并使用它来填充页面上的信息(但用户只能更改/查看部分实体),因此我只能在回邮上获取部分实体信息-在这样更新之前,我是否必须检索并分离实体?我不能使用Try/UpdateModel,因为我没有在控制器中执行此工作。任何想法或替代模式都将不胜感激

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”对象,当前/原始值太不可预测。