手动映射1到多个关系

时间:2017-06-21 02:56:39

标签: entity-framework

我正在尝试使用代码优先在EF中映射现有数据库。提供者(jetEntityFrameworkProvider)首先不支持DB。

我正在尝试映射表"组件" (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:&#39;属性&#39; ComponentText&#39;在类型&#39;组件&#39;无法映射,因为它已从模型中明确排除,或者它是所使用的DbModelBuilderVersion不支持的类型。&#39;

这些是仅包含相关属性的模型

组件

[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:

我已根据Backs回答更改了我的代码。但是,它仍然无法正常工作。我尝试了几种变体。 .HasRequired(),. HasOptional()。

注意我删除了m.ToTable(&#34; ComponentText&#34;);由于Component已经在类中映射到&#34;组件&#34;表

我收到0结果并在结果视图中收到此错误

  

错误=函数评估需要运行所有线程。

如果我取消注释评论modelBuilder.Entity<ComponentText>().HasKey(t => t.ComponentCounter);

中的部分行

我收到此错误

  

Component_ComponentText_Target :: Multiplicity在Role&#39; Component_ComponentText_Target&#39;中无效。在关系&#39; Component_ComponentText&#39;。由于“从属角色”是指关键属性,因此“从属角色”的多重性的上限必须为“&#39; 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 个答案:

答案 0 :(得分: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);
    }
    
  3. Entity Framework Fluent API - Relationships