2014-01-10 22 views
1

我开始使用EF4并努力了解如何正确添加对象。 这是一个多层应用程序,我有一个数据层,它返回我的实体。然后,我在业务层中改变该实体,并通过导航将对象添加到其链接的对象。但是,我似乎遇到了一个问题,当我尝试更新实体时,添加了相关对象。通过导航添加项目并将其存储在新的上下文中

所以我有这样的事情:

FirstTypeOfObject:身份证,SomeProperty SecondTypeOfObject:身份证,SomeProperty,FKToFirstTypeOfObject ThirdTypeOfObject:身份证,SomeProperty,FKToSecondTypeOfObject

所以我有一个1到多对多的关系。

现在在我的DAL我检索FirstTypeOfObject:

using(var context = new ObjectContext()) 
{ 
    var first = context.FirstTypeOfObjects 
    .Single(i => i.id = "something") 
    .Include(o => o.SecondTypeOfObjects.Select(s => s.ThirdKindOfObjects))) 
    return first; 
} 

然后我在我的businesslayer添加到该对象:

ThirdKindOfObject t = new ThirdKindOfObject(); 
t.SomeProperty = "test"; 
t.Id = Guid.NewGuid(); 
first.SecondTypeOfObjects.FirstOrDefault().Add(t); 

我然后调用一个方法在我的DAL:

public void UpdateObject(FirstTypeOfObject myObject) 
{ 
    using(var context = new ObjectContext()) 
    { 
    context.FirstTypeOfObject.Attach(myObject) 
    context.ObjectStateManager.ChangeObjectState(myObject, EntityState.Modified); 
    context.SaveChanges() 
    } 
} 

但是,当我更新的项目,我收到一个错误:

An object with a temporary EntityKey value cannot be attached to an object context 

我不想每次需要创建ThirdTypeOfObject时都去数据库,因为它可能是100个对象。另外我想通过实体模型进行修改,我的DAL不知道修改了什么。我不希望我的DAL知道在业务层中写入的任何类。

我这样做,因为它不是打算?我只是错过了什么?

回答

1

Also I would like to pass the entity model around for modification and my DAL doesn't know what have been modified. I don't want my DAL to know of any classes written in the business layer.

Am I doing this as it wasn't intended? Am I just missing out on something?

代替微管理数据库的上下文,即,打开和在DAL层的每一个方法闭新的上下文时,应使用每HTTP请求一个数据库上下文。数据库上下文会跟踪给定HTTP请求中的所有更改。 ObjectContext实际上是Unit of Work的一个实现,使用dependency injection container可以将工作单元的生命周期设置为HTTP请求的范围。这可以消除不连贯的实体,这可能会让你很难找到答案。

根据您的体系结构,您希望将更改保存到业务层上方的上下文中。

+0

谢谢。这对我有效。使用AutoFac DI,我现在通过HttpRequest创建一个objectContext,这对我很有用。我的DAL现在返回实体。然后通过更高层进行修改,然后通过调用DAL中的方法保存更改,然后调用.SaveChanges() –

相关问题