2013-05-17 145 views
1

我想在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"); 
      }); 
    } 
} 

OnModelCreating方法:

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」的表,但它必須映射t o doos_opgelostevragen(具體類的表)。

有沒有人在我的映射中看到問題。我正在尋找小時,我絕望...

+1

任何機會,你可以添加你的'OnModelCreating()'方法的內容? –

回答

0

我認爲這個問題在public virtual IList<OpgelostDoosVraag> OpgelosteDoosVragen { get; set; }。因爲EF有一對多關係的約定。它會自動理解複數名詞中的這個表,所以這是一個理由,因爲它拋出了這樣的異常。請去this link並修復它

請嘗試指定AbstractOpgelost類的表名稱。

您是否可以避免爲AbstractOpgelost類進行抽象?

+0

不,我不知道AbstractOpgelost必須映射到哪個表。該表取決於具體類(Table Per Concrete Class)。命名約定與它無關。 AbstractOpgelost表也不存在。 – wardva