首先,每当我使用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; }
}
答案 0 :(得分:2)
将您的上下文存储在会话中是不明智的。
每个控制器操作都应该创建一个GYOSContext实例,并在操作完成后处理该实例。
模式应该类似于
public ActionResult DoSomething()
{
using (GYOSContext context = new GYOSContext())
{
// Do stuff with context
} // Automatically disposed when exiting scope of using block
}