实体框架6代码优先流利的API一对一关系,且两端均需要

时间:2018-11-05 02:59:46

标签: entity-framework-6 relationship one-to-one ef-fluent-api

我想首先使用Entity Framework 6代码中的流利API实现一对一关系。

我有主要班级:

public class Student
{
    public int Id{ get;  set;} 
    public string Name{ get;  set;}
    public StudentProfile StudentProfile { get; set; } 
}

并且我有依赖类:

public class StudentProfile
{
    public int Id{ get;  set;} 
    public string Description{ get;  set;}
    public Student Student { get; set; } 
}

此外,我具有一对一关系的配置,在这种情况下,需要两端:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
            .HasRequired(student => student.StudentProfile)
            .WithRequiredPrincipal(profile => profile.Student);

     base.OnModelCreating(modelBuilder);   
}

执行更新数据库后,生成的生成表为:

enter image description here

表格StudentProfile列:

enter image description here

表格“学生”列:

enter image description here

在主程序上,我可以使用其个人资料保存学生:

 UMLModel umlContext = new UMLModel();

 //Studentprofile object
 StudentProfile studentProfile = new StudentProfile();
 studentProfile.Description = "Emily Profile Description";

 //Student object
 Student student = new Student();
 student.Name = "Emily";
 student.StudentProfile = studentProfile;

 //Save Student and StudenProfile Objects
 umlContext.Students.Add(student);
 umlContext.SaveChanges();

执行完主程序后,在数据库上,StudentProfiles表为:

enter image description here

“学生”表为:

enter image description here

当我尝试保存一个没有其资料的学生时,问题就出现了,该程序允许保存它,而应该不允许它保存:

UMLModel umlContext = new UMLModel();

Student student = new Student();
student.Name = "John";

umlContext.Students.Add(student);  
umlContext.SaveChanges();

在数据库上执行Main程序之后,对于StudentProfiles表,现在是:

enter image description here

和表学生:

enter image description here

防止这种情况的一种方法是使用数据注释,但由于域类需要附加代码,我不喜欢这种方法:

public class Student
{
    public int Id{ get;  set;} 
    public string Name{ get;  set;}
    [Required]
    public virtual StudentProfile StudentProfile { get; set; } 
}

问题:

  1. 这是来自流畅的API的错误吗?
  2. 是否可以使用Fluent API来解决此问题而无需修改 域类?

谢谢!

1 个答案:

答案 0 :(得分:0)

也许可以在这里查看Stack Overflow的答案,它对Entity Framework中的1:1映射给出了很好的解释,并提供了一些如何映射它们的选项,因此需要两端:https://stackoverflow.com/a/30516623/2128831