2016-04-15 31 views
0

私はEFとコードファーストを使用しています。私は2つの異なるテーブルに2つのエンティティをマップしようとします。 まず最初に、マテリアルをテーブルマテリアルにマッピングしようとします。次に、PlannedMaterialをマテリアルとScheduleRowsの両方にマッピングしようとします。2つのエンティティを2つの異なるテーブルにマップできますか?

1つのScheduleRowには、Materialsテーブルの行にForeigtnキーが必要です。 MaterialsテーブルからScheduleRowsテーブルへの外部キーはありません。

これは私のエンティティです。

public class Material 
{ 
    public int Id { get; set; } // from material table 
    public string Name { get; set; } // from material table 

    // public PlannedMaterial PlannedMaterial { get; set; } Do I need this? I don't want a relation from this side. 
} 

public class PlannedMaterial 
{ 
    public int Id { get; set; } // from *ScheduleRow table* 
    public string Name { get; set; } // from *material table* 
    public int SequenceNo { get; set; } // from *ScheduleRow* table 

    public Material Material { get; set; } // Do I need this? I'm only interrested in the Name column from the material table 
} 

これは私のテーブルです。

CREATE TABLE [dbo].[RunScheduleRow](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [SequenceNo] [int] NOT NULL, 
    [Material_id] [int] NOT NULL) -- FK to Material table 


CREATE TABLE [dbo].[Material](
    [Id] [int] NOT NULL, 
    [Name] [nvarchar](max) NULL) 

私はOnModelCreating(DbModelBuilder ModelBuilderの)に堪能APIを使用してこのマッピングをしたいです。出来ますか?どうやって?

私はすべてのアイデアや提案を感謝します。

+0

事実、 kindofは最初のコードのコンセプトに反する –

答えて

0

私はデザインが良くないと思います。 ScheduleRowとMaterial Tablesの関係を管理しようとしますが、この関係はエンティティのフレームワークによって管理できます。

public class Material 
{ 
    public int Id { get; set; } // from material table 
    public string Name { get; set; } // from material table 
    public ICollection<ScheduleRow> ScheduleRows{ get; set; } 

} 

public class ScheduleRow 
{ 
    public int Id { get; set; } // from *ScheduleRow table* 
     public int SequenceNo { get; set; } // from *ScheduleRow* table 

    public Material Material { get; set; } 
} 

あなたの列名を設定するには、テーブル

名前空間CodeFirst_FluentAPI_Tutorials {

public class YourContext: DbContext 
    { 
     public YourDBContext(): base() 
     { 
     } 

     public DbSet<Material> Materials { get; set; } 
     public DbSet<ScheduleRow> ScheduleRows { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
       //Configure default schema 
      modelBuilder.HasDefaultSchema("YourSchema"); 

      //Map entity to table 
      modelBuilder.Entity<Material>().ToTable("Material"); 
      modelBuilder.Entity<ScheduleRow>().ToTable("RunScheduleRow","dbo"); 

     } 
    } 
} 

にごshcema

public class YourContext: DbContext 
{ 
    public SchoolDBContext(): base() 
    { 
    } 

    public DbSet<Material> Materials { get; set; } 
    public DbSet<ScheduleRow> ScheduleRows { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //Configure default schema 
     modelBuilder.HasDefaultSchema("YourShema"); 
    } 
} 

地図エンティティを設定する、あなたのコンテキストにこの命令を追加し

modelBuilder.Entity<YourEntity>() 
        .Property(p => p.propertyname) 
        .HasColumnName("Caolum_name") 
        .HasColumnOrder(your_column_order) 
        .HasColumnType("column_type"); 

希望はあなたを助けます。

0

解決策を飛ばす前に、これを読んで、EFエンティティがユーザーであることと、それがあなたの考えではないと約束することができるため、EFエンティティが何であるかを明らかにします。 EFの

ルール:

  1. あなたのクラスのようなEFエンティティは、SQLテーブルに変換可能でなければなりません。
  2. 他のオブジェクトからのデータリンクについても同じです。独自の型を作成した場合の例は、ネイティブにサポートされません。
  3. 同じことがクエリになります。 EFでは、使用されるリストの種類は主にIEnumerable(読み取り専用)とICollection(読み取り/書き込み)です。

何が不足していますか?いいえ、あなたはまだデータベースに公開していない場合は、配列とリストなどを使用できます。 あなたは私の善良な先生です。規則1はありません。ソフトエンティティ(通常のDTO /モデル/クラス)を作成する必要があります。

このようなものです。ただし、PlannedMaterialはどこにも保存されません。ここで

public class PlannedMaterial 
{ 
    public PlannedMaterial(ScheduleRow s, Material m){ 
     ScheduleRow = s; 
     Material = m; 
    } 
    public int Id { get{return _s.Id; } set{_s.Id = value;} } 
    public string Name { get{return _m.Name; } set{_m.Name = value; } 
    public int SequenceNo { get{return _s.SequenceNo; } set{_s.SequenceNo = value; } 

    Material _m{ get; set; } 
    ScheduleRow _s{ get; set; } 
} 

public class Material 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<ScheduleRow> ScheduleRows { get; set; } 
} 

public class ScheduleRow 
{ 
    public int Id { get; set; } 
    public int SequenceNo { get; set; } 

    public virtual Material Material { get; set; } 
} 

コンテキスト(ビルダーを参照)

public class YourContext: DbContext 
{ 
    public SchoolDBContext(): base() 
    { 
    } 

    public DbSet<Material> Materials { get; set; } 
    public DbSet<ScheduleRow> ScheduleRows { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //Fluent API 
     modelBuilder.Entity<Material>() 
      .HasMany(e => e.ScheduleRow) 
      .WithRequired(e => e.Material) 
      .HasForeignKey(e => e.Id) 
      .WillCascadeOnDelete(false); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

リンクあなたのエンティティを行う方法です:あなたはSQLのテーブルを示していることを FluentAPI

関連する問題