2016-04-15 81 views
0

我使用EF和Code First。我試圖將兩個實體映射到兩個不同的表。 首先,我嘗試將材質映射到表材質,然後嘗試將PlannedMaterial映射到材質和ScheduleRows。我可以將兩個實體映射到兩個不同的表嗎?

一個ScheduleRow需要在材質表中有一行的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

的事實,你是顯示SQL表,有點違背代碼的概念。「 –

回答

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; } 
} 

配置您的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"); 
    } 
} 

地圖實體表

命名空間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"); 

     } 
    } 
} 

要配置的列名,則該指令添加到您的上下文

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

希望能幫到你。

0

在您跳到解決方案之前,請閱讀此部分,它將闡明EF實體的用戶身份,因爲我可以向您保證,這不是您的想法。

規則EF的:

  1. EF實體,如你的類必須轉換爲SQL表。
  2. 同樣適用於來自其他對象的數據鏈接。例如,如果您製作自己的類型,則不會本機支持。
  3. 同樣適用於查詢。在EF中,使用的列表類型主要是IEnumerable(只讀)和ICollection(讀/寫)。使用數組和列表的經過,也是acceptible如果你從來沒有發佈到數據庫again.¨

那你錯過了什麼? 你好,先生,缺少規則1,所以你必須做一個軟實體(普通DTO/Model/Class)

就好比這樣。但請注意,現在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); 
    } 
} 

鏈接: FluentAPI

相關問題