我正在使用Entity Framework 4.0处理WPF应用程序.当我尝试保存对象时,我得到了一个主键异常,但主键是一个AutoIncremented字段,我无法理解异常的原因.
所以在尝试了这个和那个,以及一些调试和使用SQL分析器后,我发现在插入我的对象之前,必须在父表中插入一条记录,因为我设置了该对象的导航属性.
所以关键是如果尝试插入Employee对象并将其部门设置为Employee.Department = deptObject,则将新记录设置为插入部门对象.
请告诉我某些导航属性对象不会插入数据库,任何属性或任何方法,Anything.
谢谢
我是EF 4的新手,这是我到目前为止所做的:
现在,我正在处理两个对象,A和B.对象A具有类型B的属性.在我的winform中,我有一个组合填充了类型B的对象.当按下保存按钮时,A类的新实例是创建并设置所有属性.对象B属性设置如下:
objectA.myObjectB = (objectB)cmbBObjects.selectedItem;
Run Code Online (Sandbox Code Playgroud)
然后我为objectA创建一个存储库并调用save方法.在这个保存方法中,我有这个代码±
public bool Save(ObjectA obj)
{
using(MyContext context = new MyContext())
{
context.objectAs.AddObject(obj);
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码确实为数据库保存了一个新条目,但它也为对象B创建了一个新记录!我不想要这个,因为对象B已经存在于数据库中!(我从组合框中选择了这个).
这就是我填充组合框的方式:
在objectB存储库中:
public IList<ObjectB> GetAll()
{
using(MyContext context = new MyContext())
{
IList<ObjectB> objects = context.objectBs.ToList();
return objects;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的形式:
ObjectBRepository rep = new ObjectBRepository();
IList<ObjectB> objects = rep.GetAll;
cmbBObjects.Datasource = objects;
// etc..
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何在不为objectB创建新记录的情况下保存对象A?