【问题标题】:Entity framework, insert object based on specific condition实体框架,根据特定条件插入对象
【发布时间】:2012-05-19 20:07:50
【问题描述】:

我必须解决问题。 我有大量的 XML 文件。在每个 XML 文件中都有不同的员工。我必须将唯一的员工添加到数据库中。在数据库中,每个员工都有名字、姓氏和出生日期。我想检查数据库中是否已经存在具有相同属性的员工,如果没有插入它。

我正在使用以下代码:

Entities entities;
entities.AddToEmployee(emp);
entities.SaveChanges();

我的员工与另一个数据结构 - 销售相关联。所以我只需要将员工的主键添加到销售表中,而不是数据库中的整个员工(以防它已经存在)。

提前致谢!

【问题讨论】:

  • 嗯,我有大树结构。当我添加基本元素(例如entities.AddToShop(shop))并保存更改后,所有数据都进入数据库,所有员工都保存在那里(它们是否已经存在并不重要)。我只想保存独特的员工。

标签: c# sql-server entity-framework


【解决方案1】:

“查找或添加模式”在这些类型的情况下很有用:

var db = new YourContext();
var emp = db.Employees.Find(empID) ?? db.Employees.Add( new Employee { FirstName ="xx" , LastName="xxx"});
db.SaveChanges();

这样,如果emp对象存在于数据库中或创建并保存到数据库中,则它已被加载。如果您要搜索多个属性,则可能需要将 Find() 替换为 Where()。

【讨论】:

  • 试过这个,但我得到这个错误:“无法将对象添加到 EntityCollection 或 EntityReference。无法将附加到 ObjectContext 的对象添加到与不关联的 EntityCollection 或 EntityReference一个源对象。”
  • 我认为这是多个 dbcontexts 的问题。尝试使用单个 dbcontext 对象执行所有工作(我通常将代码块包装在 using 语句中)。
【解决方案2】:

在实体框架中,您可以通过多种方式创建和修改关系。 在您的情况下,我将首先搜索一名员工,如果它存在,我将只设置 ForeingKey 而不是这样的导航属性

sale.EmployeeID = x; // id of existing employee

如果员工是新员工,您必须创建一个新的员工对象,然后从销售对象中引用它,然后保存它。

如果您收到“...无法将附加到 ObjectContext 的对象添加到 EntityCollection...”错误,请确保您只打开了一个上下文。 我更喜欢像这样包装我所有的数据库操作

using(var dbContext = new MyContext())
{
//do persistence stuff
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多