仅禁用 EF 6 中一个实体的插入和更新

问题描述 投票:0回答:1

我们使用 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;   
    }
}
c# entity-framework-6
1个回答
0
投票

问题下面的评论中OP接受的部分答案是将实体状态设置为分离而不是不变。

分离会让 EF 忘记它曾经接触过该实体,并在下次需要时强制重新加载它。

虽然此解决方案有效,但存在一些性能考虑因素,原始答案中未提及,但在评论中提到。

© www.soinside.com 2019 - 2024. All rights reserved.