【问题标题】:Entity framework 'table-per-concrete-class' maps to wrong table实体框架“每个具体类的表”映射到错误的表
【发布时间】:2013-05-17 01:28:51
【问题描述】:

我正在尝试使用 ASP.NET MVC 应用程序中的实体框架进行逐个具体类的映射。这是一个学校作业,我必须映射到现有的(mysql)数据库。

public class Deelnemer
{
    public Deelnemer()
    {
        OpgelosteDoosVragen = new List<OpgelostDoosVraag>();
    }

    public string Emailadres { get; set; }
    public virtual IList<OpgelostDoosVraag> OpgelosteDoosVragen { get; set; } 

    }
}

此类包含“OpgelosteDoosVragen”列表。 “OpgelosteDoosVragen”类(目前为空)继承自“AbstractOpgelost”。

public abstract class AbstractOpgelost
{
    protected AbstractOpgelost()
    {
        OpgelostId = new Guid();
    }

    public Guid OpgelostId { get; set; }
    public virtual AbstractVraag AbstractVraag { get; set; }
    public virtual AbstractAntwoord AbstractAntwoord { get; set; }
    public virtual Element Element { get; set; }
}


public class OpgelostDoosVraag : AbstractOpgelost
{

}

映射:

public class AbstractOpgelostMap : EntityTypeConfiguration<AbstractOpgelost>
{
    public AbstractOpgelostMap()
    {
        this.HasKey(t => t.OpgelostId);

        this.Property(t => t.OpgelostId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        this.HasRequired(t => t.Element).WithMany().Map(t => t.MapKey("elementNaam"));
        this.HasRequired(t => t.AbstractVraag).WithMany().Map(t => t.MapKey("vraagId"));
        this.HasRequired(t => t.AbstractAntwoord).WithMany().Map(t => t.MapKey("antwoordId"));
    }
}

public class OpgelostDoosVraagMap : EntityTypeConfiguration<OpgelostDoosVraag>
{
    public OpgelostDoosVraagMap()
    {
        this.Map(t =>
            {
                t.MapInheritedProperties();
                t.ToTable("doos_opgelostevragen");
            });
    }
}

OnModel创建方法:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {   
        modelBuilder.Configurations.Add(new OpgelostDoosVraagMap());
        modelBuilder.Configurations.Add(new DeelnemerMap());
        modelBuilder.Configurations.Add(new doosMap());
        modelBuilder.Configurations.Add(new doosVraagMap());
        modelBuilder.Configurations.Add(new DoosAntwoordMap());
        modelBuilder.Configurations.Add(new ElementMap());
        modelBuilder.Configurations.Add(new AbstractAntwoordMap());
        modelBuilder.Configurations.Add(new AbstractVraagMap());
        modelBuilder.Configurations.Add(new AbstractOpgelostMap());

    }

当我尝试访问 Deelnemer 中的列表时,会抛出 EntityCommandExecution 并显示: MySql.Data.MySqlClient.MySqlException: Table 'kindermishandeling.abstractopgelosts' doesn't exist 问题是实体框架想要映射到抽象类'AbstractOpgelost'的表,但它必须映射到doos_opgelostevragen(具体类的表)。

有人发现我的映射有问题吗?我正在寻找几个小时,我很绝望......

【问题讨论】:

  • 有没有机会添加OnModelCreating() 方法的内容?

标签: c# mysql asp.net-mvc entity-framework


【解决方案1】:

我认为public virtual IList&lt;OpgelostDoosVraag&gt; OpgelosteDoosVragen { get; set; } 的问题。因为 EF 对一对多的关系有约定。它会自动理解这个表的复数名词名称,所以这是一个原因,因为它抛出了这样的异常。请去this link修复它

请尝试为 AbstractOpgelost 类指定表名。

你能避免对 AbstractOpgelost 类进行抽象吗?

【讨论】:

  • 不,我不知道必须将 AbstractOpgelost 映射到哪个表。该表取决于具体类(Table Per Concrete Class)。命名约定与它无关。表 AbstractOpgelost 也不存在。
猜你喜欢
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2014-08-21
  • 2013-08-05
  • 1970-01-01
相关资源
最近更新 更多