Mar*_*ijn 8 .net c# entity-framework entity-framework-4
我是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?
Lad*_*nka 19
如果您不想插入objectB,则必须告知EF.当你打电话context.objectAs.AddObject(obj)给objectA你时说:我想插入objectA及其所有依赖项.但显然你不想保存家属,所以你必须:
objectB在添加之前从DB 加载objectA.在这种情况下,EF将知道它objectB是现有对象,并且不会再次插入它.objectB在添加之前附加到上下文objectA.ObjectB将按现有方式处理,但不变.objectB插入后的状态objectA.你可以通过调用:context.ObjectStateManager.ChangeObjectState(objectB, EntityState.Unchanged)第一个建议的例子:
var id = objectB.Id;
objectA.myObjectB = context.ObjectBs.SingleOrDefault(o => o.Id == id);
Run Code Online (Sandbox Code Playgroud)
第二个建议的例子:
context.ObjectBs.Attach(objectB);
objectA.myObjectB = objectB;
Run Code Online (Sandbox Code Playgroud)
第三个建议的例子:
objectA.myObjectB = objectB;
context.ObjectAs.AddObject(objectA);
context.ObjectStateManager.ChangeObjectState(objectB, EntityState.Unchanged);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9283 次 |
| 最近记录: |