2017-06-21 73 views
0

我想用代碼先映射EF中的現有數據庫。提供者(jetEntityFrameworkProvider)首先不支持DB。手動映射1到多個關係

我試圖映射表「組件」(1)表「ComponentText」(很多)

這是我

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Component>().Map(m => 
     { 
      m.Properties(p => new { p.ComponentText }); 

      m.ToTable("ComponentText"); 


     }); 

     modelBuilder.Entity<ComponentText>().HasKey(t => t.ComponentCounter); 
    } 

當我運行它,我得到後續錯誤

System.InvalidOperationException:‘上型‘組件’「屬性’ComponentText不能被映射,因爲它已被明確地從模型中排除,或者它是不被DbModelBuilderVersion被支持的類型的用過的。'

這些都是我的模型只與相關屬性

組件

[Table("Component")] 
public class Component 
{ 
    [Key] 
    [Column("Counter")] 
    public int Id { get; set; } 
    [Column("Name")] 

    public virtual ICollection<ComponentText> ComponentText { get; set; } 

} 

ComponentText

[Table("ComponentText")] 
public class ComponentText 
{ 
    [Key] 
    [Column("Counter")] 
    public int Id { get; set; } 

    public int TextId { get; set; } 
    public string Text { get; set; } 
    //** Foreign Key 
    public int ComponentCounter { get; set; } 
} 

ETA:

我每次後背改變了我的代碼回答。但是,它仍然無法正常工作。我嘗試了幾個變化。 .HasRequired(),.HasOptional()。

注意我刪除了m.ToTable(「ComponentText」);由於Component已經在類中映射到「Component」表中。

我得到0的結果,並在結果視圖收到此錯誤

錯誤=功能評價要求所有線程運行。

如果我取消了部分線路在評論modelBuilder.Entity<ComponentText>().HasKey(t => t.ComponentCounter);

我得到這個錯誤

Component_ComponentText_Target:多重不是在關係中的作用「Component_ComponentText_Target 'Component_ComponentText' 有效。由於依賴角色是指關鍵屬性,所以依賴角色的多重性的上界必須是'1'。

public class ProjectContext : DbContext 
{ 
    private DbConnection con = new JetConnection(); 

    public ProjectContext() : base(new JetConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = 'C:\Users\Ben-Laptop\Desktop\Test-Project.sep'; User Id = Admin; Jet OLEDB:Database Password = SEEME;"), true) 
    { 
     Database.SetInitializer<ProjectContext>(null); 
    } 

    public DbSet<Component> Components { get; set; } 
    public DbSet<Content> Contents { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Component>().HasMany(p => p.ComponentText).WithOptional().HasForeignKey(p => p.ComponentCounter); 

     //modelBuilder.Entity<ComponentText>().HasKey(t => t.ComponentCounter); 



    } 
} 

回答

1
  1. 刪除m.Properties(p => new { p.ComponentText });,因爲它只ComponentText
  2. 映射屬性添加映射集合

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        modelBuilder.Entity<Component>().Map(m => 
        { 
         m.ToTable("ComponentText"); 
        }) 
        .HasMany(p => p.ComponentText) 
        .WithRequired() 
        .HasForeignKey(p => p.ComponentCounter); 
    } 
    

Entity Framework Fluent API - Relationships

+0

後背:T帽子讓我進一步,但我仍然有問題。請參閱我的編輯。 – TheColonel26

+0

@ TheColonel26你不需要'modelBuilder。Entity ()。HasKey(t => t.ComponentCounter);'。你的主鍵是'Id' – Backs

+0

好吧,那就解釋了。然而,當我評論說,我仍然得到零組件的結果。而之前,我得到了223. – TheColonel26