如何使用实体框架代码优先在一对一关系中创建可选约束



在这种情况下,如何设置外键(最好使用数据注释):

[Table("Teacher", Schema = "Account")]
public partial class Teacher
{
    [Key]
    public int teacherId { get; set; }
    public string name { get; set; }
    public virtual Address Address { get; set; }
}
[Table("Student", Schema = "Account")]
public partial class Student
{
    [Key]
    public int studentId { get; set; }
    public string name { get; set; }
    public virtual Address Address { get; set; }
}

学生和教师两个表都有一个地址。

[Table("Address", Schema = "Location")]
public partial class Address
{
    [Key]
    public int addressId { get; set; }
    public string details { get; set; }
    public virtual Student Student { get; set; }
    public virtual Teacher Teacher { get; set; }
}
表地址应具有教师或学生

表的约束,这意味着地址表中的每一行都必须链接到学生或教师。

我只是找不到实现这一目标的方法。使用当前代码,在添加迁移时,我收到错误:无法确定类型"学生"和"地址"之间关联的主体端。必须使用关系流畅 API 或数据注释显式配置此关联的主体端。

您可以通过两种方式实现此目的。1. 无需在地址类上添加导航属性。

[Table("Teacher", Schema = "Account")]
public partial class Teacher
{
    [Key]
    public int teacherId { get; set; }
    public string name { get; set; }
    public virtual Address Address { get; set; }
}
[Table("Student", Schema = "Account")]
public partial class Student
{
    [Key]
    public int studentId { get; set; }
    public string name { get; set; }
    public virtual Address Address { get; set; }
}
[Table("Address", Schema = "Location")]
public partial class Address
{
    [Key]
    public int addressId { get; set; }
    public string details { get; set; }
}

将创建两个关系表学生 - 地址和教师 - 地址。2. 您可以使用可为空的外键属性。喜欢这个;

[Table("Address", Schema = "Location")]    
public partial class Address   {
[Key]
public int addressId { get; set; }    
public string details { get; set; }    
public int? teacherId { get; set; }
public int? studentId { get; set; }
[ForeignKey("studentId")]
public virtual Student Student { get; set; }
[ForeignKey("teacherId")]
public virtual Teacher Teacher { get; set; }
}

顺便说一下,如果你有兴趣实现这样的方式,你可以看看代码优先中的继承策略。通过使用继承策略,您可以创建主类并从中继承学生和教师类。之后,在地址上使用主类 ID 作为 FK。

最新更新