一对一的实体框架

问题描述 投票:1回答:1

我首先要做实体框架代码来设置我的数据库。

我有两个课程,他们的关系是一对一的,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);

我只是一个初学者,正在努力学习,感谢帮助:)。

sql visual-studio entity-framework entity-framework-core
1个回答
2
投票

从上面的代码中,是否意味着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部分。

© www.soinside.com 2019 - 2024. All rights reserved.