0

私はこれについて数回ブロックを回ってきたので、私は新鮮なアプローチをとっています. 複数の 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; }
}

ビジネスには 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 プロパティの問題は、これにより Phone に Client と Business の両方への FK が作成され、Phone が乱雑になることです。

そのため、別のポスターが手動で結合テーブルを作成しようとしているのを見ましたが、1 つの関係に参加する多面を対象としているように見えました。

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
} 

従来の 0 対多の関係を使用して、Phone を ClientPhones と BusinessPhones の「通常の」エンティティに分割する必要があります。これをモデル化するための最もクリーンな方法について誰かがアドバイスをくれれば、非常にありがたいです。

ありがとう!

4

1 に答える 1

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
{

}

これにより、クライアントと会社の電話の両方に対して、識別子列を持つ 1 つのテーブルが作成されます。これで、クライアント電話とビジネス電話を簡単に分離できます。

于 2013-04-23T06:21:55.427 に答える