我需要更多地了解实体框架的工作原理。我已经实现了运行正常并完成工作的代码。
但我需要知道这是好方法。
我有一个包含8列的表,比如说
表1
现在当我点击一个按钮时,我需要插入(如果是新的)或更新(对于现有记录)前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
来获取两个更新的记录(在现有记录方案中)。还有其他任何解决方案吗?
答案 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();
}