Entity framework 如何更新已跟踪的实体
您好,我有以下问题: 我使用Entity framework 如何更新已跟踪的实体,entity-framework,tracking,dbcontext,Entity Framework,Tracking,Dbcontext,您好,我有以下问题: 我使用EF-Core检索一个实体,然后在事务中尝试更新它。 如果我从数据库中检索到实体状态后,尝试将实体状态更改为已修改的,则更新将引发异常 我后来了解到,如果我从上下文中获取实体,它在该点上已经被跟踪,并且所有进一步的更新都不需要意味着更改实体状态 基于下面代码中的这一假设,我已经对状态更改进行了注释。不幸的是,最后实体没有得到更新。即使我调用SaveChanges public void SomeMethod(DbContext context) { var en
EF-Core
检索一个实体,然后在事务中尝试更新它。
如果我从数据库中检索到实体状态后,尝试将实体状态更改为已修改的,则更新将引发异常
我后来了解到,如果我从上下文中获取实体,它在该点上已经被跟踪,并且所有进一步的更新都不需要意味着更改实体状态
基于下面代码中的这一假设,我已经对状态更改进行了注释。不幸的是,最后实体没有得到更新。即使我调用SaveChanges
public void SomeMethod(DbContext context)
{
var entity=this.context.Find([some entity]); // the entity is started to get tracked
using(var tran=this.context.BeginTransaction())
{
try
{
//do some modifications on entity
// entity.Field1="tt";
// entity.Field2="ttx";
//this.context(entity).State=State.Modified -> throws exception saying entity is already tracked
this.context.SaveChanges();
tran.Commit(); // entity is not updated in the database !
}catch
{
tran.Rollback();
}
}
}
p.S除此之外,我还尝试先将实体状态更改为distached
,然后更改为Modified
。它仍然在Modified
行上抛出异常
有人能告诉我如何对已跟踪的实体执行更新吗
更新
我也尝试过不使用事务,但仍然没有更改跟踪的实体。因此,这基本上不会保存更改:
var entity=this.context.Find([some entity]);
//do some changes on entity without changing the entity state
this.context.SaveChanges();
更新2
显然问题出在更新上。我不仅仅是设置字段。
我确实在某个地方创建了一个新实体。问题是因为我在代码中实例化了一个新实体,而这个新实体没有被跟踪,并且。。。我期待着它在数据库中弹出。
一旦我更改为正在跟踪的实体,更新就成功了,无需将其状态更改为已修改
或其他状态。您能否在代码中包含一个简单的示例,说明您正在进行的修改会导致您描述的行为?在您进行更改的方式中可能有一些特定的内容。我只是设置了一个字符串。在执行SaveChanges
之前,实体看起来正常,但更改不会保存到数据库中。如果这是您所想的,我不会创建新对象。我没有指向另一个要清除的对象。我只更改字段。如果您更改查询以查找类型,是否有效,例如:var entity=this.context.MyEntityType.Find(entityId)?我已经解决了这个问题。代码在不需要更改状态的情况下关闭。该对象没有在数据库中更新,因为我在代码中的某个地方引用了一个新对象作为跟踪的实体