我在SQL数据库中有一个表,它应该与两个表中的一个表有关系,但不能两者都有。
我的经理通过使用表竞争对手的ID字段作为主键和另外两个表的外键来解决它。这些表都没有自动增量ID。
问题是,当我尝试添加新的竞争者时,除非在具有指定ID的其他两个表中都有一个条目,否则它将失败。这与我想要的相反。
以下是向您展示如何完成的说明:
如果之前已经发布或回复,我很抱歉。搜索时我找不到任何东西。
最诚挚的问候 Kajac
答案 0 :(得分:2)
实现这一目标的唯一方法是对两个马术班进行分类:
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();
使用此模型,您会看到EF在Equestrian表中添加了Discriminator
列(现在只有一个),它区分了两种类型。现在数据库模式强制竞争者只有一种类型的马术。
如果您想进一步微调继承架构(每个层次结构称为表),请查看here。
答案 1 :(得分:0)
当然,只需在“依赖属性”上将密钥设置为“外部”和“主要”。竞争对手应该拥有主键。
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; }
}
MSDN - Configuring a Required to Optional Relationship (One to Zero or One)