我在 SQL 数据库中有一个表,它应该与两个表中的一个有关系,但不能同时与两者都有关系。
我的经理通过使用表 Competor 的 ID 字段作为其他两个表的主键和外键来解决它。所有表都没有自动增量 ID。
问题是,当我尝试添加一个新的竞争者时,它会失败,除非在其他两个表中都有一个具有指定 ID 的条目,这与我想要的相反。
这是一个插图,向您展示它是如何完成的:
如果之前已经发布或回答过,我很抱歉。搜索时我找不到任何东西。
最好的问候卡雅克
我在 SQL 数据库中有一个表,它应该与两个表中的一个有关系,但不能同时与两者都有关系。
我的经理通过使用表 Competor 的 ID 字段作为其他两个表的主键和外键来解决它。所有表都没有自动增量 ID。
问题是,当我尝试添加一个新的竞争者时,它会失败,除非在其他两个表中都有一个具有指定 ID 的条目,这与我想要的相反。
这是一个插图,向您展示它是如何完成的:
如果之前已经发布或回答过,我很抱歉。搜索时我找不到任何东西。
最好的问候卡雅克
实现这一点的唯一方法是对两个 Equestrian 类进行子类型化:
public class EquestrianBase
{
public int Id { get; set; }
public virtual Competitor Competitor { get; set; }
}
public class Equestrian : EquestrianBase
{
// Other properties
}
public class TeamEquestrian : EquestrianBase
{
public int TeamLeaderPersonId { get; set; }
// Other properties
}
这可能是竞争对手类:
public class Competitor
{
public int Id { get; set; }
public virtual EquestrianBase EquestrianBase { get; set; }
// Other properties
}
以及基本配置:
modelBuilder.Entity<EquestrianBase>()
.HasRequired(e => e.Competitor)
.WithOptional();
使用此模型,您将看到 EFDiscriminator
向 Equestrian 表(现在只有一个)添加了一个列,用于区分这两种类型。现在,数据库模式强制要求参赛者只有一个马术运动员的任何一种类型。
如果您想进一步微调继承模式(称为按层次结构表),请查看此处。
当然,只需在“相关属性”上将键设置为 Foreign 和 Primary。竞争者应该有主键。
public class Competitor
{
[Key]
public int Id { get; set; }
}
public class Equestrain
{
[Key]
[ForeignKey("Competitor")]
public int Id{ get; set; }
public Competitor Competitor { get; set; }
}
public class TeamEquestrain
{
[Key]
[ForeignKey("Competitor")]
public int Id{ get; set; }
public Competitor Competitor { get; set; }
}