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

Jul*_*n N 8 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);
Run Code Online (Sandbox Code Playgroud)

在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()
Run Code Online (Sandbox Code Playgroud)

Tim*_*ely 1

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

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