Entity Framework 5 — абстрактный тип «X» не имеет сопоставленных потомков и поэтому не может быть сопоставлен

Я получаю следующую ошибку при попытке работать с этим объект. У кого-нибудь есть идеи? проект находится на 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

person Jeremy Gray    schedule 21.09.2012    source источник


Ответы (2)


Объект QuickFix Message не является простым DTO, что делает его непригодным для сопоставления с базой данных с использованием любого ORM. QuickFix определяет другой класс, производный от IField, для каждого типа поля FIX. Это означает, что вам придется сопоставлять как интерфейс IField с базой данных, так и каждый отдельный тип поля.

Что еще хуже, QuickFix/N — это порт с Java со многими Javaизмами, которые очень усложняют сопоставление, например. использование методов получения/установки вместо свойств. Дополнительным препятствием является то, что для каждой версии FIX существует отдельное пространство имен, а это означает, что вам придется сопоставлять 4-5 разных пространств имен с несколько одинаковыми классами, если вы хотите сохранять сообщения для всех версий FIX.

Гораздо лучшим вариантом является создание отдельных объектов DTO, которые вы можете сопоставить с базой данных и преобразовать из объекта QuickFix Message в свои DTO. К счастью, QuickFix включает словари данных для различных версий FIX в формате XML, которые можно использовать для создания DTO с помощью генератора кода.

Чтобы упростить преобразование, вы можете использовать основанный на соглашении инструмент, такой как AutoMapper, для преобразования объектов QuickFix в ваши DTO без написание кода конвертации самостоятельно.

person Panagiotis Kanavos    schedule 12.12.2012

Теперь это довольно полезное сообщение об ошибке.

Абстрактный тип QuickFix.Fields.IField не имеет сопоставленных потомков и поэтому не может быть сопоставлен. Либо удалите «QuickFix.Fields.IField» из модели, либо добавьте в модель один или несколько типов, производных от «QuickFix.Fields.IField».

Очевидно, у вас есть абстрактный класс (интерфейс?) IField, и вы пытаетесь получить их набор из своего контекста. Когда это абстрактный класс, вам нужно иметь один или несколько производных классов (определяемых столбцом дискриминатора), чтобы EF мог материализовать результаты запроса.

Если это интерфейс, вы должны отображать не интерфейс, а класс, реализующий его.

person Gert Arnold    schedule 25.09.2012