2013-04-26 95 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