实体框架-继承-状态模式-错误:“类型未映射”
本文关键字:类型 映射 类型未映射 错误 继承 框架 状态 模式 实体 | 更新日期: 2023-09-27 18:10:57
我正试图首先实现实体框架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]标签,所以,我做错了什么?一些主意吗?
谢谢!
解决!
我在这个项目中定义了另一个状态模式。这个问题是因为在实现的另一个状态模式中存在另一个继承自另一个抽象类(ProcedureStatus)的OpenStatus类。
Core.ProcedureAggregate.OpenStatus : ProcedureStatus
Core.LotAggregate.OpenStatus : LotStatus
我把状态的名称改为OpenLotStatus,它工作了…
Core.ProcedureAggregate.OpenStatus : ProcedureStatus
Core.LotAggregate.OpenLotStatus : LotStatus
看起来不可能有两个类具有相同的名称,尽管它们被定义在不同的命名空间…
谢谢大家:)
看起来您忘记在DbContext
中包含您的实体-例如
public DbSet<LotStatus> LotStatuses { get; set; }
查看此图了解更多细节实体未映射-实体模型框架