2014-02-10 140 views
0

我遇到了一个关系问题,我想如何使用实体框架。情况如下。实体框架添加现有外键

店内有多个部门;食品,饮料,娱乐等。

有一些员工在商店工作。员工可以在一个或多个部门工作。

的类我已经是:

public class Department 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<EmployeeDeparmentMapping> DeparmentMappings { get; set; } 
} 

public class EmployeeDeparmentMapping 
{ 
    public int Id { get; set; } 
    public Employee Employee { get; set; } 
    public Department Department { get; set; } 

} 

我第一次使用的代码和我的模型构建器看起来像这样

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<Employee>().HasMany(e => e.DeparmentMappings).WithRequired(e => e.Employee); 

     modelBuilder.Entity<EmployeeDeparmentMapping>().HasRequired(edm => edm.Department); 
    } 

我有一个问题,当我尝试添加EmployeeDeparmentMappings,像这样:

public void SomeMethod(EmployeeDeparmentMapping edm) 
{ 
    MyDbContext myDb = new MyDbContext(); 
    myDb.EmployeeDepartmentMappings.Add(emd); 
    myDb.SaveChanges(); 
} 

被抛出的异常是在Dep上的PRIMARY KEY违例artment表,这是因为EmployeeDepartmentMappings对象中的部门可能已经存在于数据库中,但不在DbContext中。

我试过如下:

public void SomeMethod(EmployeeDeparmentMapping edm) 
{ 
    MyDbContext myDb = new MyDbContext(); 
    myDb.Departments.Attach(emd.Department); 
    myDb.EmployeeDepartmentMappings.Add(emd); 
    myDb.SaveChanges(); 

} 

但这抛出InvalidOperationException,将更改保存到数据库,但上下文显然打破。

An exception of type 'System.InvalidOperationException' occurred in EntityFramework.SqlServer.dll but was not handled in user code 

Additional information: The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: A referential integrity constraint violation occurred: The property values that define the referential constraints are not consistent between principal and dependent objects in the relationship. 

我在做什么错在这里?

+1

是否可以从所引发的'InvalidOperationException'发布完整的错误信息? –

+0

现在没有多少时间来解释,但试着在'EmployeeDeparmentMapping'虚拟中创建'Employee'和'Department'。 –

+0

@nintendojunkie,添加到问题的感谢。 –

回答

0

尝试:

public virtual ICollection<EmployeeDeparmentMapping> DeparmentMappings { get; set; } 

public virtual Employee Employee { get; set; } 
public virtual Department Department { get; set; } 

虚拟,因为它们只是用于导航目的,它们已经存在

+0

更改为虚拟似乎没有效果,同样的问题仍然存在:( –