如何在EF 6中管理DbContext

时间:2014-08-26 04:22:59

标签: c# asp.net asp.net-mvc entity-framework dbcontext

首先,每当我使用GYOSContext时,我只需创建一个新实例来执行CRUD操作。由于我的一些数据模型并不简单,我总是遇到

的例外
EF:An entity object cannot be referenced by multiple instances of IEntityChangeTracker

我猜这个问题是因为有多个DbContext实例在同一个数据模型上工作。所以我尝试在会话中存储DbContext,每次经理类都会获得DbContext的同一个实例,这可以完美地解决我的问题。

问题是,我不太确定它是否是一个好的解决方案。请给我一些建议。

非常感谢。

首先是代码:

public class GYOSContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Item> Items { get; set; }
    public DbSet<Coupon> Coupons { get; set; }
    public DbSet<Order> Orders { get; set; }
}

代码改进:

 public class GYOSContext : DbContext
{
    private GYOSContext()
    {

    }

    public static GYOSContext GetGyosContext()
    {
        var db = HttpContext.Current.Session["GYOSContext"] as GYOSContext;
        if (db == null)
        {
            db = new GYOSContext();
            HttpContext.Current.Session["GYOSContext"] = db;
        }
        return db;
    }
    public DbSet<User> Users { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Item> Items { get; set; }
    public DbSet<Coupon> Coupons { get; set; }
    public DbSet<Order> Orders { get; set; }
}

1 个答案:

答案 0 :(得分:2)

将您的上下文存储在会话中是不明智的。

每个控制器操作都应该创建一个GYOSContext实例,并在操作完成后处理该实例。

模式应该类似于

public ActionResult DoSomething()
{
    using (GYOSContext context = new GYOSContext())
    {
        // Do stuff with context

    }  // Automatically disposed when exiting scope of using block
}