是否可以建立外键也是主键的关系?

时间:2015-06-29 14:30:37

标签: sql-server entity-framework visual-studio localdb sql-server-2012-localdb

我在SQL数据库中有一个表,它应该与两个表中的一个表有关系,但不能两者都有。

我的经理通过使用表竞争对手的ID字段作为主键和另外两个表的外键来解决它。这些表都没有自动增量ID。

问题是,当我尝试添加新的竞争者时,除非在具有指定ID的其他两个表中都有一个条目,否则它将失败。这与我想要的相反。

以下是向您展示如何完成的说明:

enter image description here

如果之前已经发布或回复,我很抱歉。搜索时我找不到任何东西。

最诚挚的问候 Kajac

2 个答案:

答案 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)