2013-03-09 5 views
0

Я использую первую модель EF. У меня есть 3 таблицы Teacher, Student и Address. Каждый учитель и ученик может иметь несколько адресов, поэтому связь между Teacher_Address и Student_Address составляет 1 для многих.Оператор DELETE противоречил ограничению REFERENCE в sql?

Для этого я написал:

public class Teacher 
{ 
public int Id; 

public virtual List<Address> Addresses { get; set; } 
} 

public class Student 
{ 
public int Id; 

public virtual List<Address> Addresses { get; set; } 
} 

public class Address 
{ 
public int Id; 

public int? TeacherId { get; set; } 
public virtual Teacher Teacher { get; set; } 

public int? StudentId { get; set; } 
public virtual Student Student { get; set; } 
} 

Свободный Api:

 //Creating 1 to * relationships b\w Teacher and Address 
     modelBuilder.Entity<Address>().HasOptional(p => p.Teacher) 
             .WithMany(p => p.Addresses) 
             .HasForeignKey(p => p.TeacherId) 
             .WillCascadeOnDelete(); 

     //creating 1 to * replationship b\w Student and Address 
     modelBuilder.Entity<Address>().HasOptional(p => p.Student) 
             .WithMany(p => p.Addresses) 
             .HasForeignKey(p => p.StudentId) 
             .WillCascadeOnDelete(); 

Я могу вставить данные для Teacher и Student, без вопроса, но когда я пытаюсь удалить любую одну строку из Teacher и Student, то это означает следующее исключение:

Оператор DELETE противоречил ограничению REFERENCE "FK_dbo.Address_dbo.Teacher_TeacherId". Конфликт произошел в базе данных «CodeFirst.TestContext», в таблице «dbo.Address», в столбце «TeacherId».

Может кто-нибудь, пожалуйста, скажите мне, как решить эту проблему и что я делаю неправильно?

ответ

0

Кажется, что отношения обратные. Если Учителю и Студенту не нужно ссылаться на адрес. Я думаю, что каскад будет работать правильно, если вы удалите запись адреса (что не так, как я думаю, вы хотите). Попробуйте добавить идентификатор адреса к другим объектам и посмотреть, удаляет ли работа.

Что-то вроде этого:

public class Teacher 
{ 
public int Id; 

public virtual List<Address> Addresses { get; set; } 
} 

public class Student 
{ 
public int Id; 

public virtual List<Address> Addresses { get; set; } 
} 

public class Address 
{ 
public int Id; 

} 

Fluent API:

modelBuilder.Entity<Teacher>().HasMany(p => p.Addresses) 
            .WillCascadeOnDelete();