2017-12-23 17 views
1

私はデータベースに顧客とユーザーの2つのエンティティを持ち、それらの間に1対多の関係を構築するので、1人の顧客 - >多数のユーザーです。Entity Frameworkモデルで1対多の関係を正しく定義する方法はありますか?

これは私の顧客のモデルである:

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

    public ICollection<User> Users { get; set; } 
} 

正しいUserモデルであるもの、私は顧客の財産とCustomerIdのプロパティまたはちょうどのCustomerIdに意味ですか?だから、この:

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

    public Customer Customer { get; set; } 

    [ForeignKey("Customer")] 
    public int CustomerId { get; set; } 
} 

..またはこれ?:

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

    [ForeignKey("Customer")] 
    public int CustomerId { get; set; } 
} 
+0

あなたは関係[ここ](https://docs.microsoft.com/en-us/ef/core/modeling/relationships) – JohnyL

+1

について読むことができます。質問は、「正しい」単一の方法がないため、意見ベースです1対多の関係を表します。示されているモデルに加えて、モデルなしのコレクション・ナビゲーション・プロパティ、明示的なFKプロパティおよびその他の組み合わせがあります。 –

+0

いくつかのオプションが利用可能であるという理由だけでは、意見に基づいた質問にはなりません。異なるバリアントの長所と短所を明確に説明できるためです。 (あなたがナビゲートできるかできないか) –

答えて

2

実際には次のコード例のようにする必要があります。ローカルプライマリキーとリモートキーを指定し、ナビゲーションプロパティ(Customer)がある場合は、このキーまたは顧客のキー(CustomerId)に基づいて「オブジェクトを認識する方法」=>を指定する必要があります。

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

    //other properties 

    [ForeignKey("CustomerId")] 
    public Customer Customer { get; set; } 

    public int CustomerId { get; set; } 
} 

あなたはナビゲーションプロパティを持つことに興味を持っていない場合、あなたは、単にだけを持っていることを避けることができます。

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

    //other properties 

    public int CustomerId { get; set; } 
} 

詳細情報が確認できます。http://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-first.aspx


注:[ForeignKey]属性を指定する必要はありません。同じ名前の(例:Navigation Property)を使用しています。 Customer & CustomerId)。同じクラスの複数の参照が(例えばあなたが正確に2お客様(CustomerA、をCustomerB)を持つユーザーを持っているがある場合

、その後、あなたは次のように指定する必要があります。

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

    //other properties 


    [ForeignKey("CustomerIdA")] 
    public Customer CustomerA { get; set; } 
    public int CustomerIdA { get; set; } 

    [ForeignKey("CustomerIdB")] 
    public Customer CustomerB { get; set; } 
    public int CustomerIdB { get; set; } 
} 
1

をあなたが持っている最初のケースでは2番目のケースでは、UserからCustomerに移動することはできず、存在しないプロパティを指すForeign Key属性を持っています。

ただし、次の順序を逆にする必要があります。 ForeingKeyAttributeを明確にしてください(どちらの方法もOKです):

[ForeignKey("CustomerId")] 
public Customer Customer { get; set; } 

public int CustomerId { get; set; } 

User.Customerが必要ない場合は、ナビゲーションプロパティの設定をすべてスキップできます。同じことがCustomer.Usersに当てはまります。必要がない場合は、そのナビゲーションプロパティの設定をスキップできます。

関連する問題