【问题标题】:Manually map 1 to Many Relationship手动将 1 映射到多个关系
【发布时间】:2017-06-21 02:56:39
【问题描述】:

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

我正在尝试将表“组件”(1)映射到表“组件文本”(很多)

这就是我所拥有的

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:“无法映射类型“组件”上的属性“组件文本”,因为它已从模型中显式排除,或者它属于正在使用的 DbModelBuilderVersion 不支持的类型。'

这些是我的模型,只有相关属性

组件

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

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

}

组件文本

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

预计到达时间:

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

注意我删除了 m.ToTable("ComponentText");因为组件已经在类中映射到“组件”表。

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

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

如果我取消注释 modelBuilder.Entity&lt;ComponentText&gt;().HasKey(t =&gt; t.ComponentCounter); 中的部分行

我收到这个错误

Component_ComponentText_Target::多重性在关系“Component_ComponentText”中的角色“Component_ComponentText_Target”中无效。因为从属角色是指关键属性,所以从属角色的多重性的上限必须是'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);



    }
}

【问题讨论】:

    标签: entity-framework


    【解决方案1】:
    1. 删除m.Properties(p =&gt; 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

    【讨论】:

    • Backs:这让我更进一步,但我仍然遇到问题。请看我的编辑。
    • @TheColonel26 你不需要modelBuilder.Entity&lt;ComponentText&gt;().HasKey(t =&gt; t.ComponentCounter);。你的主键是Id
    • 好吧,这就解释了。但是,当我对此发表评论时,我仍然在组件上得到 0 个结果。而之前,我得到 223。
    • 没关系,我解决了这个问题。我会将其标记为已回答。
    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2011-07-14
    • 2011-03-10
    • 2020-05-20
    相关资源
    最近更新 更多