EntityFramework更新部分模型

时间:2012-03-22 10:33:49

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

我正在使用mvc项目,使用存储库模式和实体框架,现在在我的表单上我有一个示例模型

的SampleModel
1)姓名
2)年龄
3)地址
4)注意事项
5)更新日期

我只在编辑表格上显示以下数据 1)姓名
2)年龄
3)地址

现在,如果我使用存储库更新缺少属性值的模型,则notes,dateupdated字段将变为空。

我的问题是如何使用存储库更新少数选定的属性(存储库中没有tryupdatemodel),我不想调用原始对象并使用更新的模型映射属性。

有什么办法,必须有。

2 个答案:

答案 0 :(得分:21)

您只能更新字段子集:

using (var context = new YourDbContext())
{
    context.SamepleModels.Attach(sampleModel);

    DbEntityEntry<SameplModel> entry = context.Entry(sampleModel);
    entry.Property(e => e.Name).IsModified = true;
    entry.Property(e => e.Age).IsModified = true;
    entry.Property(e => e.Address).IsModified = true;   

    context.SaveChanges();
}

或在ObjectContext API中:

using (var context = new YourObjectContext())
{
    context.SamepleModels.Attach(sampleModel);

    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(sampleModel);
    entry.SetModifiedProperty("Name");
    entry.SetModifiedProperty("Age");
    entry.SetModifiedProperty("Address"); 

    context.SaveChanges();
}

答案 1 :(得分:1)

这是一个老话题,但如果有兴趣的话,为了扩展Ladislav的解决方案,我们为EF 4.1及更新版本提出了一个有用的扩展方法:

public static void SetModified<TEntity>(
        this DbEntityEntry<TEntity> entry,
        IEnumerable<Expression<Func<TEntity, object>>> expressions) where TEntity : class, IEntity
    {
        foreach (var expression in expressions)
            entry.Property(expression).IsModified = true;
    }

显然,您需要取消IEntity约束,除非您为POCO使用相同名称的接口。

示例用法是:

        var user = new User
        {
            Id = Request.Id,
            UserName = Request.UserName,
            FirstName = Request.FirstName
        };

        var expressions = new List<Expression<Func<User, object>>> 
                 { 
                     x => x.UserName, 
                     x => x.FirstName
                 };

        context.Entry(user).SetModified(expressions);