2013-11-07 1 views
0

У меня есть четыре модели, которые являются семьей, матерью, отцом, учеником, я пытаюсь связать отца & Мать & Студент с семейной таблицей и таблицей учеников, связанной с таблицами Мать и Отец. Здесь Семейная таблица содержит информацию о семье. Таблицы матери и отца содержат их личную информацию, а таблица Student содержит информацию о студентах + MotherID и FatherID. Это означает, что «Семейный стол» был основным столом для «Матери и отца», «Студенческая таблица». Материнскую таблицу «Матери» и таблицу «Отец отца» ссылались на «Студенческий стол».Код EF Сначала с отношениями «один-ко-многим» и «многие-ко-многим»? вызывают циклы или несколько каскадных путей

Я использую MVC 4 Entity Framework Code First,

Это мои модели классов.

public class Family 
{ 

    public int FamilyID { get; set; } 
    public string FamilyName { get; set; } 

    public virtual ICollection<Mother> Mothers { get; set; } 
    public virtual ICollection<Father> Fathers { get; set; } 
    public virtual ICollection<Student> Students { get; set; } 
} 
public class Mother 
{ 
    public int MotherID { get; set; } 
    public int FamilyID { get; set; } 
    public string FirstName { get; set; } 
    public string SSN { get; set; } 

    public virtual Family Families { get; set; } 
    public virtual ICollection<Student> Students{ get; set; } 
} 
public class Father 
{ 
    public int FatherID { get; set; } 
    public int FamilyID { get; set; }  
    public string FirstName { get; set; } 
    public string SSN { get; set; } 

    public virtual Family Families { get; set; } 
    public virtual ICollection<Student> Students { get; set; } 

} 
public class Student 
{ 
    public int StudentID { get; set; } 
    public int FamilyID { get; set; } 
    public int MotherID { get; set; } 
    public int FatherID { get; set; } 
    public string FirstName { get; set; } 
    public string SSN { get; set; } 

    public virtual Family Families { get; set; } 
    public virtual Mother Mothers { get; set; } 
    public virtual Father Fathers { get; set; } 

} 

База данных Context Класс:

public class MYContext:DbContext 
{ 

    public DbSet<Family> Families { get; set; } 
    public DbSet<Mother> Mothers { get; set; } 
    public DbSet<Father> Fathers { get; set; } 
    public DbSet<Student> Students { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
     //modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
     //base.OnModelCreating(modelBuilder);    
    } 


} 

После написания выше код, я просто побежал следующие команды на менеджере пакетов консоли.

PM> Add-Migration InitialContext Для меня создан класс InitialContext.cs.

PM> Update-Database -Verbose Это дает мне ошибку ниже

Introducing FOREIGN KEY constraint 'FK_dbo.Student_dbo.Mother_MotherID' on table          
'Student' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON 
UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 
Could not create constraint. See previous errors. 

enter image description here

Что я делаю не так ??

Почему я получаю эту ошибку ??? Пожалуйста, помогите мне!

Каков правильный способ реализации отношений «один ко многим» и «многие ко многим» с использованием кода EF? Прошу вас посоветуйте с этим примером.

ответ

0

Попробуйте добавить аннотацию [key] непосредственно над вашими ключами. Например, для студента, это будет выглядеть так ...

public class Student 
{ 
    [key] 
    public int StudentID { get; set; } 
    public int FamilyID { get; set; } 
    public int MotherID { get; set; } 
    public int FatherID { get; set; } 
    public string FirstName { get; set; } 
    public string SSN { get; set; } 

    public virtual Family Families { get; set; } 
    public virtual Mother Mothers { get; set; } 
    public virtual Father Fathers { get; set; } 

} 

Это скажет вам, в деталях, как управлять моделью с точки зрения codefirst.

http://thedatafarm.com/blog/data-access/code-first-entity-framework-4-1-videos-and-articles-on-msdn/

0

Я нашел такую ​​же проблему и решение в Entity Framework, Code First modeling and a cyclical reference

Исключение доносился из БД SQL Server не из структуры объекта, что структура таблицы с теми же ограничениями, созданных вручную, будут недействительны. Внешние ключевые свойства таблицы Mother (Mother.FamilyID) и таблица «Отец» (Father.FamilyID), таблица учащихся (Student.MotherID) & (Student.FatherID) не могут быть нулевыми, те, которые представляют требуемые отношения и соответствующие столбцы в базе данных, также не могут быть нулевыми. Таким образом, DB не допускает эту модель.

Если я удаляю все эти свойства из классов моделей, то автоматическое отношение становится необязательным, поскольку свойства навигации могут быть пустыми, поэтому DB обрабатывается как это еще одна модель, поскольку столбцы FK в БД могут быть nullable. По-видимому, это разрешенная модель.

Это сработало для меня!Используйте NULLABLE типа следующего

Вот решение для циклов вызывают или нескольких каскадных пути вопросов:

public class Student 
{ 
public int StudentID { get; set; } 
public int FamilyID { get; set; } 

общественных межд? MotherID {get; задавать; } // типы с нулевым значением

public int? ОтецID {get; задавать; } // обнуляемые типов

public string FirstName { get; set; } 
public string SSN { get; set; } 

public virtual Family Families { get; set; } 
public virtual Mother Mothers { get; set; } 
public virtual Father Fathers { get; set; } 

} 

Наконец моя модель становится с иностранными ключевыми свойствами, которые представляют собой необязательно вместо требуемых отношений.

действительно очень благодарен @https://stackoverflow.com/users/270591/slauma и https://stackoverflow.com/users/173937/decibyte за помощь в этом вопросе.

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