实体框架 - 仅更新实体的几列

时间:2017-09-21 02:39:34

标签: c# entity-framework

我需要更多地了解实体框架的工作原理。我已经实现了运行正常并完成工作的代码。

但我需要知道这是好方法。

我有一个包含8列的表,比如说

表1

  • Column1(pk)
  • Column2,Column3,Column4,Column5,Column6,Column7,Column8

现在当我点击一个按钮时,我需要插入(如果是新的)或更新(对于现有记录)前6列。

在同一个按钮点击事件中,作为同一个过程的一部分,我将调用一个存储过程(带有主键id Column1的参数),它将在存储过程中获取这6列值本身并将根据六个列值进行一些计算,并返回我需要在Column7,Column8中更新的两个新值。

所以,过程将是:

  • 新记录:插入(六列数据),计算(调用存储过程),更新(最后2列)

  • 现有记录:更新(六列数据),计算(调用存储过程),更新(最后2列)

现在,对于插入,我使用

_dbContext.Table1.Add(entity);
 _dbContext.SaveChanges();

对于现有记录更新(前6列),我使用

//code - Entity property values are updated with new ones
_dbContext.Table1.Attach(entity);
_dbContext.Entry(entity).State = EntityState.Modified;
_dbContext.SaveChanges();

对于上次更新,Column7,Column8,我使用

var entity = GetById(Id);

if (entity != null)
{
    entity.Column7 = value1;
    _dbContext.Entry(entity).Property(t => t.Column7).IsModified = true;
    entity.Column8 = value2;
    _dbContext.Entry(entity).Property(t => t.Column8).IsModified = true;

    _dbContext.SaveChanges();
}

我不知道为什么我不需要为最后更新附加实体。是不是因为我在同一张桌子上面调用了GetById方法?

没有附加实体如何更新列? (如果我附加实体,它会给出错误说已经被跟踪)

此外,我必须多次调用GetById来获取两个更新的记录(在现有记录方案中)。还有其他任何解决方案吗?

2 个答案:

答案 0 :(得分:0)

为此你可以使用MapToModel方法

这是示例

//code - Entity property values are updated with new ones
var newEntity= new Entity
{
    Id = p.Id, // the Id you want to update
    Column1= ""  // put value for column/s that you need to update
};
newEntity.MapToModel(oldEntity);
_dbContext.SaveChanges();

答案 1 :(得分:0)

恕我直言,如果您通过上下文获取,我认为您不需要为每个属性指定IsModified

除非您更改默认行为,否则EF Context将自动跟踪实体

EF知道从数据库加载后哪些实体发生了变化,因此只会更新。

假设GetById从数据存储中提取数据。

var entity = GetById(Id);

if (entity != null)
{
    entity.Column7 = value1;
    entity.Column8 = value2;
    _dbContext.SaveChanges();
}

Detect Changes

Similar Question