首先使用代码和迁移创建两个类之间的1-1关系

时间:2015-07-26 12:31:56

标签: entity-framework ef-code-first code-first ef-migrations

嗯,这是我第一次尝试使用代码创建两个表之间的1-1关系。我在网上得到了一些帮助,并遇到了以下类映射。

比我运行迁移并发现错误。例如。迁移说StudentDetails的主键是Student表中的date,而我希望有主键StudentId。此外,外键正在以相反的方式创建。

请有人突出显示这里的错误,或者是我认为错了。

我需要使用Id类中的Id作为StudentDetails类中的外键。

student

当我运行迁移时,我得到以下结果,看起来不太好。

public class Student
{
    public bool isPass{get;set;}
    public virtual StudentReport Report { get; set; }
}

public class StudentReport
{
    [Key, ForeignKey("Student")]
    public Guid Id { get; set; }

    public Guid? StudentReportId { get; set; }
    public string RollNumber { get; set; }
    public string StudentType { get; set; }

    public virtual Student Student { get; set; }
}

1 个答案:

答案 0 :(得分:0)

在一对一关系中,一端必须是委托人,另一端是依赖关系。如果要在依赖实体中声明FK属性,则EF要求该属性也应为PK:

public class Principal
{
   [Key]
   public int Id{get;set;}
   public virtual Dependent Dependent{get;set;}
}

public class Dependent
{
   [Key, ForeignKey("Principal")]
   public int PrincipalId{get;set;}

   public virtual Principal Principal{get;set;}
}

如果您希望两个实体都拥有自己的PK,并且在Id类中使用Student实体中的StudentReport作为FK,那么您可以尝试使用此模型:

public class Student
{
    [Key]
    public Guid Id { get; set; }
    public bool isPass{get;set;} 
}

public class StudentReport
{
    [Key]
    public Guid StudentReportId{ get; set; }

    [ForeignKey("Student")]
    public Guid StudentId { get; set; }

    public string RollNumber { get; set; }
    public string StudentType { get; set; }

    public virtual Student Student { get; set; }
}

我猜你真正需要的是一对多的关系,因为学生可能有0或很多报告。

检查link。它可以帮助您更好地理解如何使用FK属性和默认代码优先的名称约定。

更新1

如果你想创建一对一的关系并且两个实体都拥有自己的PK,那么由于我在答案开始时解释的限制,你无法在依赖实体中定义FK属性。您需要的解决方案可能是使用Required属性并删除FK属性:

public class Student
{
    [Key]
    public Guid Id { get; set; }
    public bool isPass{get;set;} 

   public virtual StudentReport StudentReport { get; set; }
}

public class StudentReport
{
    [Key]
    public Guid StudentReportId{ get; set; }

    public string RollNumber { get; set; }
    public string StudentType { get; set; }
    [Required]
    public virtual Student Student { get; set; }
}

更新2

你确定吗?我得到的迁移代码是:

 AddForeignKey("dbo.StudentReports", "StudentReportId", "dbo.Students", "Id");

还不行,因为Code First仍按惯例配置StudentReport的PK作为FK。为避免这种情况,您可以将此Fluent Api配置添加到您的上下文中:

modelBuilder.Entity<StudentReport>()
            .HasRequired(sr => sr.Student)
            .WithOptional(s => s.StudentReport)
            .Map(c=>c.MapKey("Student_Id"));

这样Code First将生成此迁移代码:

 AddColumn("dbo.StudentReports", "Student_Id", c => c.Guid(nullable: false));
 CreateIndex("dbo.StudentReports", "Student_Id");
 AddForeignKey("dbo.StudentReports", "Student_Id", "dbo.Students", "Id");