【问题标题】:3 foreign keys to one table to one column3 个外键到一个表到一列
【发布时间】:2018-07-02 15:05:21
【问题描述】:

有 2 个实体:“A”和“B”。 本质上,“A”有字段:

 - A_id (PK)
 - B1_id (FK)
 - B2_id (FK)
 - B3_id (FK)

本质上是“B”:B_id等字段。是否可以与 EF 和 MS 建立一对一的关系,其中“B1_id”、“B2_id”和“B3_id”是表“B”中一个属性 B_id 的外部键。如果可以的话,我怎么命名类“A”中的导航属性,我觉得应该是三个?

【问题讨论】:

  • 什么是基数?它们是一对一的还是一对多的?如果是后者,则必须建立一个交集表。为什么一个表中的多个列都引用另一个表中的一列?另外,我认为你不能从整数到二进制进行 FK - 我不确定这是否是一个错字。
  • 除了前面提到的数据类型问题之外,这听起来像是一个有问题的设计。但很难确定,因为这是匿名发布的。
  • 除了数据类型不匹配以及联结表可能是更好的结构之外,您不能在 SQL Server 中创建从一个表到另一个表的多个外键,具有声明性引用完整性.您可以在 Postgres 甚至 SQLite 中使用,以防这些对您来说是可行的替代方案。
  • 1.这是一个错字,表“B”的B_id列应该是Int类型2。这个连接的意思是表“B”存储图像,而表“A”存储3个对表“B”中各种图像的引用.所以这是一对一的关系 3。我不确定,但我也认为这是一个糟糕设计的例子。如果您有建议,我希望看到更好的解决方案

标签: c# sql .net sql-server entity-framework


【解决方案1】:
public class A
{
    public int Id { get; set; }
    //another properties

    public virtual B B1 { get; set; }
    public int B1Id { get; set; }

    public virtual B B2 { get; set; }
    public int B2Id { get; set; }

    public virtual B B3 { get; set; }
    public int B3Id { get; set; }
}

public class B
{
    public int Id { get; set; }
    //another properties

    [InverseProperty(B1)]
    public virtual ICollection<A> A1 { get; set; }
    [InverseProperty(B2)]
    public virtual ICollection<A> A2 { get; set; }
    [InverseProperty(B3)]
    public virtual ICollection<A> A3 { get; set; }
}

【讨论】:

    【解决方案2】:

    你可以这样做:

     public class A
        {
            public int Id { get; set; }
    
            public int B1Id { get; set; }
            public int B2Id { get; set; }
            public int B3Id { get; set; }
    
            [ForeignKey("B1Id")]
            public B B1 { get; set; }
    
            [ForeignKey("B2Id")]
            public B B2 { get; set; }
    
            [ForeignKey("B3Id")]
            public B B3 { get; set; }
        }
    
        public class B
        {
            public int Id { get; set; }
    
            public string Name { get; set; }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      相关资源
      最近更新 更多