阻止实体框架自动附加实体

时间:2009-11-20 16:54:18

标签: c# entity-framework c#-3.0

我正在使用实体框架,它使用的实体是数据库表示和业务对象 因此,这意味着一些被操纵的实体应始终与上下文分离。

我设法从数据库读取和写入数据,但在更新时遇到一个小问题:
我有一个表“Stock”,它链接到一个表“Warehouse”。

目前的流程就是这个(简化,但精神依然存在,还有更多领域):

  • 创建一个新对象Stock并且其字段填充了一些值(date ...)
  • 当前仓库(从数据库中提取整个请求的对象)与Stock对象
  • 相关联
  • 将对象发送到DAL方法,其工作是保存它。
  • DAL方法检查数据库中当天(相同日期,仓库和相同类型)的库存项目是否已存在
  • 如果存在,该方法将从提取的对象更新卷并保存更改。
  • 否则,将插入新的Stock对象。

这里的问题是,当我创建新的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()

1 个答案:

答案 0 :(得分:1)

您可能只想将MergeOption设置为适当的值。 NoTracking会将所有内容保持在分离状态,并允许您执行手动工作。可能有其他方法可以做到这一点,但我正在通过将MergeOption设置为分离来做类似的事情。

http://msdn.microsoft.com/en-us/library/system.data.services.client.dataservicecontext.mergeoption.aspx