2017-06-21 111 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