Entity framework 如何创建一对一关系而不在从属实体中具有导航属性

Entity framework 如何创建一对一关系而不在从属实体中具有导航属性,entity-framework,ef-code-first,code-first,Entity Framework,Ef Code First,Code First,我理解以下代码在主体和从属实体之间创建了“一对一关系” 不过,我想问: 是否可以创建一对一关系而不在依赖实体中包含导航属性 如果是,那么我应该如何重新编写以下代码 public class Student { [Key] public int Id { get; set; } public string FullName { get; set; } public StudentReport StudentReport { get; set; } } publi

我理解以下代码在主体和从属实体之间创建了“一对一关系”

不过,我想问:

  • 是否可以创建一对一关系而不在依赖实体中包含导航属性

  • 如果是,那么我应该如何重新编写以下代码

    public class Student
    {
        [Key]
        public int Id { get; set; }
        public string FullName { get; set; }
    
        public StudentReport StudentReport { get; set; }
    }
    
    public class StudentReport
    {
        [Key, ForeignKey("Student")]
        public int Id { get; set; }
        public string RollNumber { get; set; }
        public string StudentType { get; set; }
    
        public Student Student { get; set; }
    }
    

  • 要创建一对一的关系,而不在从属端创建导航属性,您需要使用。例如,在
    DbContext
    类中,您可以覆盖
    OnModelCreating
    并使用它定义关系:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // I'm assuming the report is optional
        modelBuilder.Entity<Student>() 
            .HasOptional(t => t.StudentReport) 
            .WithRequired();
    }
    

    请参阅
    WithRequired()

    的文档,谢谢您的回答。外键呢?所以,在上面的例子中,我假设“StudentReport”(从属)实体中的“Id”将是主键和外键。如果我错了,请纠正我?第二点:使用您的方法(Fluent API),我是否仍然需要在主体(学生)内定义导航属性?i、 e.public StudentReport StudentReport{get;set;}@immirza:默认情况下,当EF中存在一对一关系时,依赖实体的主键用作外键。如果您首先使用代码,则关系中至少有一个实体需要具有导航属性(否则,EF如何知道这些实体是相关的?@immirza:该语句可能会覆盖
    HasOptional(..)。WithRequired()
    因为它定义了与相同实体和相同导航属性的不同关系。如果您愿意,您可以在
    with required()
    之后添加
    .WillCascadeOnDelete()
    ,但我认为如果您为每个
    StudentReport
    设置了
    StudentReport
    @immirza所需的
    Student
    ,则默认情况下应该将其级联删除。如果您有一个
    StudentReport.Student
    导航属性,它将是
    WithRequired(sr=>sr.Student)
    ,但由于您不打算在该方向上拥有导航属性,这意味着当您有
    WithRequired()
    时,
    Student
    是必需的。你可以把它想象成一句话:“一个学生有一个可选的StudentReport和一个必选的(学生)。”
    public class StudentReport
    { 
        public int Id { get; set; }
        public string RollNumber { get; set; }
        public string StudentType { get; set; }
    }