如何将已删除的实体回滚到以前的状态?

时间:2013-01-30 10:02:12

标签: c#-4.0 entity-framework-4.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));

经过?

0 个答案:

没有答案