gpt4 book ai didi

c# - 使用现有对象插入新对象

转载 作者:太空狗 更新时间:2023-10-29 18:08:48 25 4
gpt4 key购买 nike

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

  • 根据我的数据库创建一个 edmx 文件
  • 为我的对象创建代码生成 (POCO)。现在我有一个 model1.tt,展开后我会看到我所有的类
  • 基于 IRepository 为每个类创建一个存储库

现在,我正在处理两个对象,A 和 B。对象 A 具有类型 B 的属性。在我的 winform 中,我有一个组合,其中填充了类型 B 的对象。按下保存按钮时,一个新的实例创建类 A 并设置所有属性。对象B属性设置如下:

objectA.myObjectB = (objectB)cmbBObjects.selectedItem;

然后我为 objectA 创建一个存储库并调用保存方法。在这个保存方法中我有这个代码±

public bool Save(ObjectA obj)
{
using(MyContext context = new MyContext())
{
context.objectAs.AddObject(obj);
context.SaveChanges();
}
}

这段代码确实在数据库中保存了一个新条目,但它也为对象 B 创建了一条新记录!我不想要这个,因为对象 B 已经存在于数据库中! (我从组合框中选择了这个)。

这是我填充组合框的方式:

在 objectB 存储库中:

public IList<ObjectB> GetAll()
{
using(MyContext context = new MyContext())
{
IList<ObjectB> objects = context.objectBs.ToList();
return objects;
}
}

在我的表单中:

ObjectBRepository rep = new ObjectBRepository();
IList<ObjectB> objects = rep.GetAll;

cmbBObjects.Datasource = objects;
// etc..

所以我的问题是,在不为对象 B 创建新记录的情况下,我该怎么做才能保存对象 A?

最佳答案

如果您不想插入 objectB,您必须通知 EF。当您为 objectA 调用 context.objectAs.AddObject(obj) 时,您是在说:我想插入 objectA 及其所有依赖项。但显然您不想保存依赖项,因此您必须:

  • 从数据库加载objectB,然后再将其添加到objectA。在这种情况下,EF 将知道 objectB 是现有对象,并且不会再次插入它。
  • 在将 objectB 添加到 objectA 之前将其附加到上下文。 ObjectB 将被视为存在但未更改。
  • 在插入objectA 后设置objectB 的状态。您可以通过调用:context.ObjectStateManager.ChangeObjectState(objectB, EntityState.Unchanged)

拳头建议示例:

var id = objectB.Id;
objectA.myObjectB = context.ObjectBs.SingleOrDefault(o => o.Id == id);

第二个建议的例子:

context.ObjectBs.Attach(objectB);
objectA.myObjectB = objectB;

第三条建议的例子:

objectA.myObjectB = objectB;
context.ObjectAs.AddObject(objectA);
context.ObjectStateManager.ChangeObjectState(objectB, EntityState.Unchanged);

关于c# - 使用现有对象插入新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5416323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com