2017-05-01 21 views
0

Entity Frameworkが結合テーブルに余分の列CurValNewValを作成しない理由を誰かが説明できますか? DeviceFeatureIDUserDeviceIDという結合表を作成しています。Entity Frameworkが結合テーブルに余分な列を作成しない

public class DeviceFeature 
{ 
     [Display(Name = "ID")] 
     public int DeviceFeatureID { get; set; } 

     [Required]   
     public string Name { get; set; } 
     public string Description { get; set; } 

     public virtual ICollection<DeviceType> DeviceTypes { get; set; } 
     public virtual ICollection<UserDevice> UserDevices { get; set; } 
} 

public class UserDevice 
{ 
     public int UserDeviceID { get; set; } 
     public int DeviceTypeID { get; set; } 
     public string UserID { get; set; } 
     public string DeviceName { get; set;} 

     public virtual ICollection<DeviceFeature> DeviceFeatures { get; set; } 
} 

public class UserDeviceFeatureStatus 
{ 
     public int UserDeviceID { get; set; } 
     public int DeviceFeatureID { get; set; } 

     public virtual UserDevice UserDevice { get; set; } 
     public virtual DeviceFeature DeviceFeature { get; set; } 

     public string CurVal { get; set; } 
     public string NewVal { get; set; } 
} 
+0

DbContextを共有できますか。 –

+0

Roy、これは私のdbcontextpublicです。申し訳ありませんが、私は返信でコードを書式設定する方法を学ぶ必要があると思います。 クラスIOTWebContext:DbContext { パブリックIOTWebContext():ベース( "名前= IOTWebContext") {} 公共System.Data.Entity.DbSet DeviceTypes {得ます。セット; } パブリックSystem.Data.Entity.DbSet DeviceFeatures {get;セット; } パブリックSystem.Data.Entity.DbSet UserDevices {get;セット; } } – Tom

+1

@Tom、コメントよりも、質問を編集してDBContextを追加するだけです。 –

答えて

0

多対多リレーションシップテーブルは、エンティティではなく、バーチャルコレクションによって自動的に生成されます。

DbContextに結合エンティティを含めることもできます(ただし、仮想コレクションを削除しない限り、おそらくテーブルが重複します)。または、Fluent APIを使用して関係を設定できます。後であなたがReleationShipタイプにあなたの仮想コレクションを変更する必要がありますし、あなたのOnModelCreatingにこれを追加する操作を行うに

:DeviceFeature

modelBuilder.Entity<UserDeviceFeatureStatus>() 
     .HasKey(t => new { t.UserDeviceID, t.DeviceFeatureID }); 

    modelBuilder.Entity<UserDeviceFeatureStatus>() 
     .HasOne(pt => pt.UserDevice) 
     .WithMany(p => p.DeviceFeatures) // from UserDevice 
     .HasForeignKey(pt => pt.UserDeviceID); 

    modelBuilder.Entity<UserDeviceFeatureStatus>() 
     .HasOne(pt => pt.DeviceFeature) 
     .WithMany(t => t.UserDevices) //from DeviceFeature 
     .HasForeignKey(pt => pt.DeviceFeatureID); 

public virtual ICollection<UserDeviceFeatureStatus> UserDevices { get; set; } 

UserDevice

public virtual ICollection<UserDeviceFeatureStatus> DeviceFeatures { get; set; } 


m EF関係についての情報は、文書hereをご覧ください。

0

UserDeviceDeviceFeatureUserDeviceFeatureStatusの間に多対多の関係を作成する場合は、2つのテーブルから「結合」テーブルへのナビゲーションプロパティが必要です。直接UserDeviceからDeviceFeatureへ、またはその逆へのナビゲートを直接試みてください。ただし、関係テーブルに、リンクしようとしているテーブルの主キー以外のフィールドが含まれている場合は、EFでこれを行うことはできません。

あなたはこれを試すことができます。

public class DeviceFeature 
{ 
    [Display(Name = "ID")] 
    public int DeviceFeatureID { get; set; } 

    [Required]   
    public string Name { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<DeviceType> DeviceTypes { get; set; } 
    public virtual ICollection<UserDeviceFeatureStatus> UserDeviceFeatureStatuses { get; set; } 

} 

public class UserDevice 
{ 
    public int UserDeviceID { get; set; } 
    public int DeviceTypeID { get; set; } 
    public string UserID { get; set; } 
    public string DeviceName { get; set;} 

    public virtual ICollection<UserDeviceFeatureStatus> UserDeviceFeatureStatuses { get; set; } 
} 

public class UserDeviceFeatureStatus 
{ 

    public int UserDeviceID { get; set; } 
    public int DeviceFeatureID { get; set; } 

    public virtual UserDevice UserDevice { get; set; } 
    public virtual DeviceFeature DeviceFeature { get; set; } 

    public string CurVal { get; set; } 
    public string NewVal { get; set; } 
} 

だから UserDeviceから例えば DeviceFeatureに移動し、そこから DeviceFeatureに最初 UserDeviceFeatureStatusに移動する必要があります。

関連する問題