实体框架代码首先 - 共享1对多实体

时间:2013-04-23 03:12:09

标签: entity-framework ef-code-first mapping

我已经多次绕过这个街区了,所以我采取了新的方法。我想弄清楚是否可能有一个单个实体位于多个0对多关系的多方面。这就是我想要做的事情:

客户端有0到多个电话

public class Client
{
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int ClientId { get; set; }
  public string Name { get; set; }

  public virtual ICollection<Phone> Phones { get; set; }
}

A Business拥有0到多个手机

public class Business
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int BusinessId { get; set; }
  public string Name { get; set; }

  public virtual ICollection<Phone> Phones { get; set; }
}

这是电话:

public class Phone
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int PhoneId { get; set; }

  public string Number { get; set; }
}

当然,Business / Client中的Phones属性的问题在于,这会在电话中为客户端和业务创建FK,这会使电话混乱。

所以,我看到另一张海报尝试创建一个手动连接表,但它似乎适合参与一个关系的多方:

public class ClientPhone
{
  public int ClientID { get; set; }
  public int PhoneID { get; set; }

  public virtual Client Client { get; set; } // One Client
  public virtual Phone Phone { get; set; } // One Phone
} 

我应该将电话拆分为ClientPhones和BusinessPhones&#39; normal&#39;使用传统0对多关系的实体。如果有人可以就最简洁的方式给我一些建议,那将非常感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您可以使用每个层次结构表的方法对此进行建模,

public class Client
{
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int ClientId { get; set; }
  public string Name { get; set; }

  public virtual ICollection<ClientPhone> Phones { get; set; }
}


public class Business
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int BusinessId { get; set; }
  public string Name { get; set; }

  public virtual ICollection<BusinesPhone> Phones { get; set; }
}


public class Phone
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int PhoneId { get; set; }

  public string Number { get; set; }
}

public class BusinesPhone:Phone
{

}

public class ClientPhone:Phone
{

}

这将为客户端和公司电话创建一个带有鉴别器列的表。然后,您可以轻松地分离客户端和商务电话。