1

考虑以下情况:

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));

通过?

4

0 回答 0