2016-10-26 15 views
1

MVCアプリケーションを作成していて、コードファーストアプローチを使用してデータベースを生成したいとします。私はシンプルなテーブルでこれをやってきましたが、今では私がForeign Key関係を導入しているので、物事は私のために混乱しています。コードを最初に使用する外部キーの割り当て

は、私は、データベース内の、独自のテーブルを持っていますそれぞれの3つのクラスが、持っている:

public class Device 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int InternalDeviceID { get; set; } 

     public int DeviceID { get; set; } 

     public string DeviceName { get; set; } 

     public virtual EquipmentDevice EquipmentDevice { get; set; } 
    } 

public class Equipment 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int InternalEquipmentID { get; set; } 

     public int EquipmentID { get; set; } 

     public string EquipmentName { get; set; } 

     public virtual EquipmentDevice EquipmentDevice { get; set; } 
    } 

public class EquipmentDevice 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int InternalEquipmentDeviceID { get; set; } 

     public virtual ICollection<Equipment> EquipmentID { get; set; } 

     public virtual ICollection<Device> DeviceID { get; set; } 
    } 

関係は(多くの機器は、多くのデバイスを有していてもよく、およびデバイスは、多くの機器に属しているかもしれないということです私が間違っていなければ多くに)。機器がどの機器に関連付けられているのかを整理するために、私はEquipmentDeviceテーブルを使用しています。これらのIDは、そのIDとそのテーブルの内部IDをペアにするだけです。

私は、これが、このような状況をコード化する方法であると考えていました。これは、関係の多くの側がSingle側のICollection <オブジェクトを持ち、Single関係の側にはMany側の仮想オブジェクトがあります(どちらのクラスもN:Nの場合はICollectionが<>、どちらも仮想の場合は1:1)

ただし、データベース、私のテーブルは次のようになります。

デバイステーブルenter image description here

機器表 enter image description here

EquipmentDevice表

enter image description here

私は私のテーブルの外部キーを設定していているように、単に後方アム、または別の問題がありますこのような状況のために私は完全に欠けていますか?私はこの主題に関する非常に有益な情報源を見つけることができませんでした。私はまた、これらのテーブルの図が同様に見えるものを添付して、より明確にするために役立てています。

enter image description here

答えて

1

あなたは、機器とデバイスのプロパティをCLOSE-いるICollectionsする必要があります。結合テーブルのクラスを定義する必要はなく、EFがそれを処理します。ここにあなたのクラスは(のようになります。ここでは、外部キーを生成するには

http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

public class Device 
      { 
       public Device() 
       { this.Equipments = new HashSet<Equipment>();} 

       [Key] 
       [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
       public int InternalDeviceID { get; set; } 

       public int DeviceID { get; set; } 

       public string DeviceName { get; set; } 

       public virtual ICollection<Equipment> Equipments { get; set; } 
      } 

    public class Equipment 
     { 

      public Equipment() 
      { this.Devices = new HashSet<Device>(); } 

      [Key] 
      [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
      public int InternalEquipmentID { get; set; } 

      public int EquipmentID { get; set; } 

      public string EquipmentName { get; set; } 

      public virtual ICollection<Devices> Devices { get; set; } 
     } 
+0

非常にいいです - 私はEFがあなたのためにリレーショナルテーブルを作成することを認識していませんでした!しかし、あなたはおそらく "公共機器()... HashSet"と "公共デバイス(... HashSet)"クラスの部分を詳しく説明できますか?今の私の例では、私はそれを見つけたとは思わない。 –

+1

EFは、多対多リレーションシップのいずれかの側でコレクションプロパティを表すためにHashSetオブジェクトを使用する。データベースまたはメモリからデータを取り込めるように、コンストラクタでそれらを「新しくする」必要があります。そうしないと、DBロード時にNullReferenceExceptionが発生します。また、CRUD操作のコレクションの1つを使用しようとすると、 –

+0

それでは、私はTable_AとTable_Bを持っているとしましょう。これらはそれぞれ1:Nの関係を持っています。私はTable_AのIDをTable_BのFKとして使用したいが、Table_Bのどの列もTable_Aに存在する必要はない。私はこの関係から新しいテーブルを作成していないので、Table_Aは "public virtual Table_B objectname"プロパティを持ち、Table_Bは "public virtual ICollection objectname"プロパティを持ち、AからBへの外部キーを持ちますか? –

1

:)良い参考何だ、まず最初に、モデルを作成することです。

public class Device 
{ 
    [Key] 
    public int DeviceID { get; set; } 
    public string DeviceName { get; set; } 

    public virtual ICollection<Equipment> Equipments { get; set; } 
} 

public class Equipment 
{   
    [Key] 
    public int EquipmentID { get; set; } 
    public string EquipmentName { get; set; } 

    public virtual ICollection<Device> Devices { get; set; } 
} 

次に、各モデルのドライバを生成してコンパイルします。 最初のモデルを生成することによって、「コンテキスト」を作成します。プロジェクトをロードした後

enter image description here

し、作成したドライバへのアクセス権を持っているかどうかを確認します。

enter image description here

今すぐデータベースをチェック。新しいテーブルの2つの外部キーがテーブルに自動的に作成されます。

+0

[Key]と[ForeignKey(文字列名)]の違いは何ですか? –

+0

キーは主キーです。あなたは外部キーを割り当てるcuando utilizas –

+0

"[Key]"が主キーです。外部キーは、Device and EquipmentモデルのICollectionを使用して割り当てられます。 –

関連する問題