如何使用实体框架更新字段子集

本文关键字:字段 子集 更新 框架 何使用 实体 | 更新日期: 2023-09-27 18:14:06

我有多个对象,其中包含表中字段的子集。在某些情况下,我应该只更新一个字段。如何在实体框架6.0中正确地做到这一点?下面的代码由于数据库约束抛出错误,因为AddOrUpdate试图用空值替换FieldName以外的所有字段。

public static TheField Set(TheField f)
{
    using (var dbContext = new MyModel())
    {
            dbContext.MyEntity.AddOrUpdate(new MyEntity()
            {
                ForeignId = f.ForeignId,
                FieldName = f.FieldName,
            });
            dbContext.SaveChanges();
            return f;
    }
}

如果有扩展名

就好了
public static class MyExtension
{
    public static void AddOrUpdateSchema<TEntity, TKey>(this IDbSet<TEntity> set, TKey id, string schema, 
        params TEntity[] entities) where TEntity : class
    {
        // ...
    }
}

,然后使用

public class MyEntity
{
    [Key]
    public int ForeignId { get; set; }
    [UpdateSchema("Schema")]
    public string FieldName { get; set; }
    // ...
}
public class MyEntityView
{
    public int ForeignId { get; set; }
    public string FieldName { get; set; }
    public static MyEntityView Set(MyEntityView f)
    {
        using (var dbContext = new MyModel())
        {
            dbContext.MyEntity.AddOrUpdateSchema(f.ForeignId, "Schema", new MyEntity()
            {
                FieldName = f.FieldName,
            });
            dbContext.SaveChanges();
            return f;
        }
    }
}

或者实体框架已经有这个任务的功能?

如何使用实体框架更新字段子集

设置State属性为EntityState.Modified

db.Entry(entity).State = EntityState.Modified;

请检查以下代码是否适合您:

using (var dbContext = new MyModel())
{   
    if (dbContext.MyEntities.Any(e => e.ForeignId == f.ForeignId))
    {
        dbContext.MyEntities.Attach(f);
        dbContext.ObjectStateManager.ChangeObjectState(f, EntityState.Modified);
    }
    else
    {
        dbContext.MyEntities.AddObject(f);
    }
    dbContext.SaveChanges();
}