【问题标题】:Entity Framework - Inheritance - Status Pattern - Error: "The type was not mapped"实体框架 - 继承 - 状态模式 - 错误:“类型未映射”
【发布时间】:2013-04-26 12:36:25
【问题描述】:

我正在尝试使用 Entity Framework 5 Code First 来实现状态模式。

我的场景有一个名为 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] 标签所以,我在做什么?有什么想法吗?

谢谢!

【问题讨论】:

    标签: c# ef-code-first entity-framework-5


    【解决方案1】:

    解决了!

    我在这个项目中定义了另一个状态模式。问题是因为在实现的另一个状态模式中存在另一个继承自另一个抽象类 (ProcedureStatus) 的 OpenStatus 类。

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

    我将状态名称更改为 OpenLotStatus 并且它起作用了...

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

    看起来不可能有两个同名的类,尽管它们被定义在不同的命名空间中......

    谢谢大家:)

    【讨论】:

      【解决方案2】:

      您似乎忘记在 DbContext 中包含您的实体 - 例如

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

      更多详情请参阅此Entity Not Mapped - Entity Model Framework

      【讨论】:

      • 包含:public DbSet LotStatus { get;放; }
      • 然后为实体和您的上下文放置一个完整的可重现代码,我稍后会尝试看看它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 2011-08-28
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      相关资源
      最近更新 更多