2009-11-20 67 views
8

我正在使用实体框架,它使用的实体是数据库表示和业务对象。
所以这意味着一些被操纵的实体应该总是与上下文保持分离。阻止实体框架自动附加实体

我设法读取和写入数据库中的数据,但我有一个小问题时更新:
我有一个表“股票”链接到一个表“仓库”。

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

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

这里的问题是,当我创建新的股票对象,并将其关联到仓库,对象EntityState被自动设置为“补充”。所以当我执行SaveChanges()并且股票已经存在时,这条线被更新并且新的股票线被添加...
我想要的是保持新的股票对象独立直到我自己附加它。我不希望它自动发生。

我发现的唯一解决方案是在保存之前从上下文中分离新对象,如果对象已经存在。
我也可以分离()仓库对象,但这不是一个令人满意的解决方案,我认为在真实情况下有更多的项目关联,我不确定这是一个好主意玩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); 

在保存():

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

对我也一样!你弄明白了吗? – 2012-06-08 03:40:15

+0

可悲的是。我不记得我使用的解决方法。我想我开始使用POCO对象。 – 2012-06-09 10:55:11

回答