0

我有四个模型,即家庭、母亲、父亲、学生,我试图将父亲和母亲和学生与家庭表和学生表与母亲和父亲表相关联。此处家庭表包含有关家庭的信息。Mother 和 Father 表包含他们的个人信息,Student 表包含学生信息 + MotherID 和 FatherID。这意味着家庭表是母亲和父亲的主要表,学生表。Mother表的MotherID和父亲表的FatherID被引用到Student表。

我首先使用 MVC 4 实体框架代码,

这些是我的模型类。

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

}

数据库上下文类:

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.

在此处输入图像描述

我究竟做错了什么??

为什么我收到这个错误???请帮我一个!

首先使用EF代码实现一对多和多对多关系的正确方法是什么?请用这个例子指导我。

4

2 回答 2

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

}

这将详细告诉您如何从代码优先的角度管理您的模型。

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

于 2013-11-11T21:15:08.883 回答
0

我在实体框架、代码优先建模和循环参考中发现了相同的问题和解决方案

异常来自 SQL Server DB 而不是实体框架,手动创建的具有相同约束的表结构将无效。母表(Mother.FamilyID)和父表(Father.FamilyID)、学生表(Student.MotherID)和(Student.FatherID)的外键属性不可为空,表示所需关系的外键属性和数据库中对应的列也不可为空。所以 DB 不允许这个模型。

如果我从模型类中删除所有这些属性,那么关系自动变为可选,因为导航属性可以为空,因此 DB 现在被视为另一个模型,因为 DB 中的 FK 列可以是nullable. 看起来这是一个允许的模型。

它对我有用!使用可空类型如下

以下是原因循环或多级联路径问题的解决方案:

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

公共诠释?MotherID { 得到; 放; } //可空类型

公共诠释?父亲 ID { 得到;放; } //可空类型

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/slaumahttps://stackoverflow.com/users/173937/decibyte 在此类问题上帮助我。

于 2013-11-12T05:45:55.503 回答