实体框架5 - 抽象类型“X”没有映射后代,因此不能被映射(Entity Framework 5

2019-09-22 17:39发布

尝试在运行时,我收到以下错误此对象 。 任何人有什么想法? 该项目是在GitHub上,但你很可能无法运行它,除非你有一个FIX服务器周围铺设。 我似乎无法对上网本的错误消息。

    System.InvalidOperationException was unhandled by user code
      Message=The abstract type 'QuickFix.Fields.IField' has no mapped descendents and so cannot be mapped. Either remove 'QuickFix.Fields.IField' from the model or add one or more types deriving from 'QuickFix.Fields.IField' to the model. 
      Source=EntityFramework
      StackTrace:
           at System.Data.Entity.ModelConfiguration.Edm.Services.StructuralTypeMappingGenerator.GetEntityTypeMappingInHierarchy(DbDatabaseMapping databaseMapping, EdmEntityType entityType)
           at System.Data.Entity.ModelConfiguration.Edm.Services.AssociationTypeMappingGenerator.GenerateIndependentAssociationType(EdmAssociationType associationType, DbDatabaseMapping databaseMapping)
           at System.Data.Entity.ModelConfiguration.Edm.Services.AssociationTypeMappingGenerator.Generate(EdmAssociationType associationType, DbDatabaseMapping databaseMapping)
           at System.Data.Entity.ModelConfiguration.Edm.Services.DatabaseMappingGenerator.GenerateAssociationTypes(EdmModel model, DbDatabaseMapping databaseMapping)
           at System.Data.Entity.ModelConfiguration.Edm.Services.DatabaseMappingGenerator.Generate(EdmModel model)
           at System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.GenerateDatabaseMapping(EdmModel model, DbProviderManifest providerManifest)
           at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
           at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
           at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
           at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
           at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
           at System.Data.Entity.Internal.InternalContext.Initialize()
           at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
           at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
           at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
           at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
           at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
           at System.Data.Entity

Answer 1:

的QuickFix Message对象不是简单的DTO,这使得它们不适合用于映射到使用任何ORM的数据库。 的QuickFix定义了每个FIX字段类型不同IField派生的类。 这意味着,你将不得不映射两个IField的数据库接口和每一个人字段类型。

更糟糕的是,QuickFix的/ N是从Java端口与许多Javaisms,使映射非常困难的,例如使用getter / setter方法,而不是性能。 另外一个障碍是,有每个修复版本,这意味着你将不得不地图有点相同等级4-5不同的命名空间,如果你想坚持的消息对所有FIX版本不同的命名空间。

一个更好的选择是创建单独的DTO的对象,你可以映射到数据库中,并从QuickFix的Message对象转换为您的DTO。 幸运的是,QuickFix的包括XML格式的各种版本FIX的,你可以用它来生成利用代码生成您的DTO的数据字典。

为了使转换更容易,你可以使用一个以公约为基础的工具,像AutoMapper到QuickFix的对象,你的DTO的转换,而无需编写自己的转化代码。



Answer 2:

现在,这是一个非常有益的错误消息。

抽象类型“QuickFix.Fields.IField”没有映射后代,因此不能被映射。 无论是从模型中删除“QuickFix.Fields.IField”或添加一种或多种衍生自“QuickFix.Fields.IField”的模型。

显然,你已经有了一个抽象类(接口?) IField和你想从您的上下文获得它们的集合。 当它是你需要有一个或多个派生类的抽象类(由鉴别列定义)EF能够兑现的查询结果。

如果它是一个接口,你不应该映射接口,但实现它的类。



文章来源: Entity Framework 5 - The abstract type 'X' has no mapped descendents and so cannot be mapped