2014-02-10 5 views
0

У меня возникла проблема с получением отношения к работе, как хотелось бы с Entity Framework. Ситуация такова.Entity Framework Добавляет существующий внешний ключ

В магазине есть несколько отделов; еда, напитки, развлечения и т. д.

В магазине есть несколько сотрудников. Сотрудникам разрешается работать в одном или нескольких отделах.

Классов я являюсь:

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; } 

} 

Я использую код первый и мой ModelBuilder выглядит что-то вроде этого

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 Это связано с тем, что отдел в объекте 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

Не так много времени для объяснения, но попробуйте сделать 'Employee' и' Department' в 'EmployeeDeparmentMapping' виртуальным. –

+0

@nintendojunkie, добавленный к вопросу спасибо. –

ответ

0

Try:

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

и

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

виртуальный, потому что они предназначены только для навигации цели они уже существуют

+0

Изменение их на виртуальные, похоже, не имело эффекта, то же самое происходит и с проблемами :( –

Смежные вопросы