2013-04-26 101 views
1

我試圖用實體框架5代碼優先來實現狀態模式。實體框架 - 繼承 - 狀態模式 - 錯誤:「類型未映射」

我的情況下有一個名爲LotStatus一個抽象的部分基類,5類,從這個繼承:OpenStatus,AwardedStatus,CancelledStatus,ContractSignedStatus和EvaluationStatus:

public abstract partial class LotStatus { ... } 

    public class OpenStatus : LotStatus { ... } 
    public class AwardedStatus : LotStatus { ... } 

從的DbContext的OnModelCreating我添加一個配置模型構建器,以地圖這些實體:

modelBuilder.Configurations.Add(new LotStatusConfiguration()); 

LotStatusConfiguration的代碼如下:

public class LotStatusConfiguration : EntityTypeConfiguration<LotStatus> 
    { 
     public LotStatusConfiguration() 
     { 
      ToTable("LotStatus"); 
      HasKey(ls => ls.LotStatusID); 

      this.Map<OpenStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(OpenStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)")); 
      this.Map<EvaluationStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(EvaluationStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)")); 
      this.Map<AwardedStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(AwardedStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)")); 
      this.Map<ContractSignedStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(ContractSignedStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)")); 
      this.Map<CancelledStatus>(pk => pk.Requires("Discriminator").HasValue(typeof(CancelledStatus).AssemblyQualifiedName).HasColumnType("nvarchar(max)")); 
     } 
    } 

當EF試圖創建它提出了一個錯誤的數據庫:

The type 'OpenStatus' was not mapped. Check that the type has not been explicitly excluded by using the Ignore method or NotMappedAttribute data annotation. Verify that the type was defined as a class, is not primitive, nested or generic, and does not inherit from EntityObject. 

我沒有任何[NotMapped]標記,這樣,我在做什麼撥錯?一些想法?

謝謝!

回答

1

解決了!

我有這個項目中定義的另一個狀態模式。問題是因爲在其他狀態模式中實現的另一個OpenStatus類從另一個抽象類(ProcedureStatus)繼承。

Core.ProcedureAggregate.OpenStatus : ProcedureStatus 
Core.LotAggregate.OpenStatus : LotStatus 

我改變現狀的名字OpenLotStatus和它的工作...

Core.ProcedureAggregate.OpenStatus : ProcedureStatus 
Core.LotAggregate.OpenLotStatus : LotStatus 

看起來它不可能有兩個類具有相同的名稱雖然他們在不同的命名空間中定義.. 。

感謝所有:)

0

看起來您忘記將您的實體納入DbContext - 例如,

public DbSet<LotStatus> LotStatuses { get; set; } 

見這一個一些細節Entity Not Mapped - Entity Model Framework

+0

它包括:公共DbSet LotStatus {獲得;組; } – 2013-04-26 12:57:08

+0

然後爲實體和您的上下文放置一個完全可重複的代碼,稍後我會試着看看它 – NSGaga 2013-04-26 12:59:41