嗯,这是我第一次尝试使用代码创建两个表之间的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; }
}
答案 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属性和默认代码优先的名称约定。
如果你想创建一对一的关系并且两个实体都拥有自己的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; }
}
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");