我正在使用实体框架,它使用的实体是数据库表示和业务对象 因此,这意味着一些被操纵的实体应始终与上下文分离。
我设法从数据库读取和写入数据,但在更新时遇到一个小问题:
我有一个表“Stock”,它链接到一个表“Warehouse”。
目前的流程就是这个(简化,但精神依然存在,还有更多领域):
这里的问题是,当我创建新的Stock对象并将其与Warehouse关联时,对象EntityState会自动设置为“已添加”。因此,当我执行SaveChanges()并且Stock已经存在时,该行将更新并添加一个新的Stock行...
我想要的是保持新的Stock对象分离,直到我自己附加它。我不希望它自动发生。
我找到的唯一解决方案是在保存对象已存在之前从上下文中分离新对象
我也可以Detach()仓库对象,但这不是一个令人满意的解决方案我认为在真实情况下有更多的项目需要关联,我不确定在他们身上使用Attach()和Detach()是个好主意。
在这种情况下,直到我自己“添加”它到上下文,该对象只是一个“传输”对象,我希望它不在上下文中。
关于如何保持Stock对象分离的任何想法?
代码(可能有点不正确,我是通过内存写的):
Stock stk = new Stock();
stk.Date = DateTime.Now;
stk.Volume = 100; //so far stk is "Detached" and that's cool.
stk.Warehouse = CurrentWarehouse; //stk become "Added" and that's less cool.
DAL.Stock.Instance.Save(stk);
在Save()中:
var existing = (from s in Context.CurrentContext.Stock
where s.Warehouse.WarehouseId == stk.Warehouse.WarehouseId && s.Date == stk.Date && s.Type == 2
select s).FirstOfDefault();
if(existing != null)
{
existing.Volume = stk.Volume;
Context.CurrentContext.Detach(stk); //I find it a stupid workaround !!!!!!
}
else
{
Context.CurrentContext.AddToStock(stk); //what I would want to do.
}
Context.CurrentContext.SaveChanges()
答案 0 :(得分:1)
您可能只想将MergeOption设置为适当的值。 NoTracking会将所有内容保持在分离状态,并允许您执行手动工作。可能有其他方法可以做到这一点,但我正在通过将MergeOption设置为分离来做类似的事情。