我们使用 C# 和 EF 6 代码优先方法,并获得了一堆实体类型。是否可以仅对一种实体类型禁用插入和更新,并仍然使用 EF 6 对该特定实体类型进行删除/选择操作?
我目前正在重写
SaveChanges
类中的 DbContext
方法,并使用插入/更新检查更改中是否存在特定实体类型,然后使用 ADO.NET 手动对数据库进行插入/更新并重新设置该实体类型的所有实例的状态为“未更改”,然后调用 base.SaveChanges()
.
即使现在新值已更新到数据库(通过 ADO.NET),但当我尝试再次使用这些实体并使用原始旧值重置时,它们不会反映在实体中,但不会他们被修改并保存到数据库的那个。
我仍然需要调用
base.SaveChanges()
,因为用户可能执行了各种操作,这会影响其他实体类型,并且它们仍然应该通过 EF 更新到数据库。
有没有一种方法可以让我仍然可以将更改的值保留在实体实例中,即使我手动将它们更新到数据库。
public override int SaveChanges()
{
// Save to database using Ado.Net
this.SaveEmployeeEntitiesIfAny();
// Have to call this so that other entity types with their changes
// can be persisted to the database through EF.
return base.SaveChanges();
}
private void SaveEmployeeEntitiesIfAny()
{
// Retrieve the list of Added or Updated Employee Type Entities
var employeeEntities = this.ChangeTracker
.Entries<EmployeeEntity>()
.Where(x => x.State == EntityState.Modified || x.State == EntityState.Added);
// Insert them to the database through Ado.Net
// Manually reset the state to Unchanged so that base.SaveChanges() won't pick it
foreach (var entry in dbEntityEntries)
{
this.Entry(entry.Entity).State = EntityState.Unchanged;
}
}
问题下面的评论中OP接受的部分答案是将实体状态设置为分离而不是不变。
分离会让 EF 忘记它曾经接触过该实体,并在下次需要时强制重新加载它。
虽然此解决方案有效,但存在一些性能考虑因素,原始答案中未提及,但在评论中提到。