考虑以下情况:
public class EntityA
{
public int Id { get; set; }
}
public class EntityB
{
public int Id { get; set; }
public virtual EntityA EntityA { get; set; }
}
public class Context : DbContext
{
public Context()
: base("EF_SPIKE")
{
}
public IDbSet<EntityA> EntityAs { get; set; }
public IDbSet<EntityB> EntityBs { get; set; }
}
static void Main(string[] args)
{
using (var context = new Context())
{
var a = context.EntityAs.Create();
context.EntityAs.Add(a);
var b = context.EntityBs.Create();
b.EntityA = a;
context.EntityBs.Add(b);
context.SaveChanges();
using (var transaction = new TransactionScope())
{
context.EntityBs.Remove(b);
context.SaveChanges();
}
Trace.Assert(b.EntityA == null);
Trace.Assert(context.EntityBs.Local.All(x => x.Id != b.Id));
Trace.Assert(context.EntityBs.Any(x => x.Id == b.Id));
}
}
因此,尽管事务回滚并且实体仍然存在于数据库中,但实体框架实体b
不再存在于本地缓存中,丢失了其所有外键引用并且b
无法再使用。
这种行为对我来说似乎很奇怪,因为虽然我已经回滚,但我的实体仍然死了。
是否有任何标准的解决方法,以便:
Trace.Assert(context.EntityBs.Local.Any(x => x.Id == b.Id));
通过?