2010-05-06 54 views
1

我试图从我的数据库中提取雇员行。员工表格有对作业表格的引用。实体框架不提取特定列

现在我想用一些新的信息更新员工行。我把新的信息放在一个新的Employee对象中,然后使用这个对象来更新数据库中旧的Employee信息。直到我在Employee tabel和Job tabel之间添加了引用,这个工作很好。

之后,实体框架期望我的新员工对象还包含需要更新的作业引用。但事实并非如此。当我创建新的Employee对象时,我没有关于Job参考的信息。因此,当我使用下面的代码时,出现此错误:

* DELETE语句与REFERENCE约束“FK_EmployeeProjects_Employees”冲突。冲突发生在数据库“***”,表“dbo.EmployeeProjects”,列'EmployeeId'。声明已被终止。*

public Employee EditEmployee(Employee employee) 
    { 
     try 
     { 
      var originalEmployee = GetEmployeeWithoutJobs(employee.Id); 

      _entities.ApplyPropertyChanges(originalEmployee.EntityKey.EntitySetName, employee); 

      _entities.SaveChanges(); 

      return originalEmployee; 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

我可以通过某种方式告诉实体框架忽略更新此示例中的作业引用吗?

+0

'ApplyPropertyChanges'已经更新只标量。该错误可能在'GetEmployeeWithoutJobs'中。你可以发布该源? – 2010-05-06 13:14:58

回答

0

我没有看到您在GetEmployeeWithoutJobs()方法中编写的代码,但我怀疑您需要在您的ObjectStateManager中包含作业引用。换句话说,你应该写这样的事情:

var originalEmployee = (from e in context.EmployeeSet.Include("Jobs") 
          where e.Id = employeeId 
          select e).FirstOrDefault(); 

而且你应该使用ApplyCurrentValues(),而不是过时ApplyPropertyChanges()

+0

这就是该方法看起来是多么的准备,而且不起作用。 – Poku 2010-05-06 09:23:47