我首先要做实体框架代码来设置我的数据库。
我有两个课程,他们的关系是一对一的,Lecturer和LoginInfo。
public class Lecturer
{
public int LecturerId { get; set; }
public string FullName { get; set; }
public int UserId { get; set; }
public LoginInfo LoginInfo { get; set; }
}
public class LoginInfo
{
public int UserId { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public bool ChangePassword { get; set; }
public Lecturer Lecturer { get; set; }
}
所以对于我的实体框架,我已经为一对一的关系写了这个。
modelBuilder.Entity<Lecturer>()
.HasOne(input => input.LoginInfo)
.WithOne(input => input.Lecturer)
.HasForeignKey<Lecturer>(input => input.UserId);
从上面的代码中,是否意味着Lecture有一个LoginInfo,LoginInfo和一个Lecturer,而Lecturer有一个UserId作为外键?
另一个问题是,对于这种一对一的关系,我是否必须为LoginInfo编写另一组代码,如下所示:
modelBuilder.Entity<LoginInfo>()
.HasOne(input => input.Lecturer)
.WithOne(input => input.LoginInfo)
.HasForeignKey<LoginInfo>(input => input.LecturerId);
我只是一个初学者,正在努力学习,感谢帮助:)。
从上面的代码中,是否意味着Lecture有一个LoginInfo,LoginInfo和一个Lecturer,而Lecturer有一个UserId作为外键?
正确。这也意味着LoginInfo
是主要的,而Lecturer
是关系的依赖端。此外,由于FK属性不可为空,因此需要关系,即为了创建Lecturer
,您必须首先创建LoginInfo
,这与另一个Lecturer
无关。
另请注意,由于UserId
未遵循PK名称的默认约定,因此您应明确将其配置为LoginInfo
的PK:
modelBuilder.Entity<LoginInfo>()
.HasKey(e => e.UserId);
另一个问题是,对于这种一对一的关系,我是否必须像这样为LoginInfo编写另一组代码
不。单一关系需要单一配置和单个FK。如果这样做,您将定义第二个关系,这也将在实体之间创建循环依赖关系,这通常应该避免。第一个流畅配置完全定义了所需的关系,足以处理加载相关数据和其他CRUD操作。
有关术语,关系类型和配置的更多信息,请参阅EF Core文档的Relationships部分。