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