我开始使用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知道在业务层中写入的任何类。
我这样做,因为它不是打算?我只是错过了什么?
谢谢。这对我有效。使用AutoFac DI,我现在通过HttpRequest创建一个objectContext,这对我很有用。我的DAL现在返回实体。然后通过更高层进行修改,然后通过调用DAL中的方法保存更改,然后调用.SaveChanges() –