C# EntityFramework更新部分模型

C# EntityFramework更新部分模型,c#,asp.net-mvc,windows,entity-framework,C#,Asp.net Mvc,Windows,Entity Framework,我正在从事mvc项目,使用存储库模式和实体框架,现在在我的表单上有一个示例模型 样本模型 1) 名称 2) 年龄 3) 地址 4) 注意事项 5) 更新日期 我仅在编辑表单上显示以下数据 1) 名称 2) 年龄 3) 地址 现在,如果我使用存储库用缺少的属性值更新模型,notes,dateupdated字段将变为null 我的问题是如何使用存储库(tryupdatemodel在存储库中不可用)仅更新少数选定的属性,并且我不想调用原始对象并将属性映射到更新的模型 是否有任何方法,必须有。您只能更新

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

样本模型
1) 名称
2) 年龄
3) 地址
4) 注意事项
5) 更新日期

我仅在编辑表单上显示以下数据
1) 名称
2) 年龄
3) 地址

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

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


是否有任何方法,必须有。

您只能更新字段的子集:

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();
}

这是一个旧线程,但如果有人感兴趣,为了扩展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;
    }
publicstaticvoidsetmodified(
此DbEntityEntry,
IEnumerable表达式),其中tenty:class,ienty
{
foreach(表达式中的var表达式)
entry.Property(表达式).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);
var user=新用户
{
Id=Request.Id,
UserName=Request.UserName,
FirstName=Request.FirstName
};
var表达式=新列表
{ 
x=>x.UserName,
x=>x.FirstName
};
context.Entry(user).SetModified(表达式);

ohh ok或编写sql查询以进行更新,对吗?或者编写一个通用帮助器来标记编辑的属性,哼哼。。。这就是TryUpdate必须做的。Entry()在EF 4.0中不存在。@Suncat2000:第二个例子是EF 4.0,第一个是EF 4.1和更新版本。如何更改此方法以更新不同的属性而不重新编译?我只想添加它以充分利用此方法,您必须通过.Configuration.ValidateOnSave=false在上下文级别禁用模型验证。从技术上讲,您可以通过在模型中输入“虚拟数据”来确保您的模型满足模型状态验证——如果您不将这些属性设置为“修改”,这将不会发送到SQL,但我建议您不要使用这种方法。
        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);