使用现有对象插入新对象

Mar*_*ijn 8 .net c# entity-framework entity-framework-4

我是EF 4的新手,这是我到目前为止所做的:

  • 根据我的数据库创建edmx文件
  • 为我的对象(PO​​CO)创建代码生成.现在我有了一个model1.tt,扩展后我会看到我的课程
  • 基于IRepository为每个类创建一个存储库

现在,我正在处理两个对象,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)