Entify Framework:重用添加到已处置上下文的实体是否合法

时间:2016-12-07 14:46:16

标签: c# entity-framework

假设我创建了一个Entity Framework entity1并将其添加到dbContext1。 然后,我出于任何原因,Dispose dbContext1并创建一个新的DbContext2。

现在可以通过将entity1添加到dbContext2来重用entity1吗?

EF版本是6.1.3。

public class DbSaver
{
    MyDbContext _context;

    public DbSaver()
    {
        MyDbContext _context = new MyDbEntities();
    }

    public void MustDoSave(/*whatever*/)
    {
        bool saved = false;

        MyEntity entity1 = new MyEntity() { /*setup entity field values here*/ };
        _context.Add(entity1);

        while (!saved)
        {
            try
            {
                _context.SaveChanges();
                saved = true;
            }
            catch
            {
                _context.Dispose();   // dispose the original context ("contextA)
                _context = new MyDbEntities(); // create a fresh one

                // the questionable part:
                _context.Add(entity1); // is it legal to now reuse an entity previously added to the old context ("contextB")??

                Thread.Sleep(1000); // wait before fresh retry
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

是的,因为实体没有保留对当前与之关联的上下文(或上下文)的引用。

答案 1 :(得分:0)

这是一个棘手的问题。如果更改已持久,则实体将填充标识字段。不要仅仅因为事务已经回滚而被填充 - 这是DbContext类的实现细节。

因此,如果您将相同的实体添加到新的DbContext,假设它仍然是新的,即没有填充其身份字段,则在尝试第二次持续更改时可能会遇到麻烦。 / p>

我的建议不是这样做,因为您的代码的正确性取决于实体框架的实现细节。毋庸置疑,实施可能会在未来发生变化,然后您的代码似乎今天正常工作将在明天停止工作。