2012-09-21 2 views
3

를 매핑 할 수 없습니다. 아무도 아이디어 없어? project은 GitHub에 있지만, FIX 서버를 설치하지 않으면 실행할 수 없습니다. 이 오류 메시지는 인터넷에 표시되지 않습니다.엔티티 프레임 워크 5 - 추상 형 'X'는 어떤 매핑 후손이없는 등 <a href="https://github.com/gbirchmeier/quickfixn/blob/master/QuickFIXn/Message/FIX44/TradeCaptureReportRequestAck.cs" rel="nofollow">this object</a>에서 작동 할 때 나는 다음과 같은 오류를 받고 있어요

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 

답변

2

QuickFix 메시지 객체는 ORM을 사용하여 데이터베이스에 매핑하기에 부적합하게하는 간단하지 DTO들입니다. QuickFix는 각 FIX 필드 유형에 대해 서로 다른 IField 파생 클래스를 정의합니다. 즉, IField 인터페이스를 데이터베이스와 각 필드 유형에 매핑해야합니다.

설상가상으로, QuickFix/N 매핑이 매우 어려워 많은 Javaisms 자바에서 포트는, 예를 들면이다 속성 대신 getter/setter 메서드 사용 추가 장애물은 모든 FIX 버전에 대한 메시지를 계속하려는 경우 다소 동일한 클래스와 4-5 다른 네임 스페이스를 매핑해야 의미 각 FIX 버전에 대해 별도의 공간이 있다는 것입니다.

훨씬 더 나은 옵션은 데이터베이스에 매핑하여 DTO들에 QuickFix 메시지 객체로 변환 할 수있는 별도의 DTO 객체를 생성하는 것입니다. 다행히 QuickFix에는 코드 생성기를 사용하여 DTO를 생성하는 데 사용할 수있는 XML 양식의 다양한 버전의 FIX 용 데이터 사전이 포함되어 있습니다.

변환을 쉽게하려면 변환 코드를 직접 작성하지 않고 AutoMapper과 같은 컨벤션 기반 도구를 사용하여 QuickFix 개체를 DTO로 변환 할 수 있습니다.

2

이제는 매우 유용한 오류 메시지입니다.

추상 형식 'QuickFix.Fields.IField'에는 매핑 된 하위 항목이 없으므로 매핑 할 수 없습니다. 'QuickFix.Fields.IField'를 모델에서 제거하거나 'QuickFix.Fields.IField'에서 파생 된 하나 이상의 유형을 모델에 추가하십시오.

분명히 당신은 추상 클래스 (인터페이스?) IField을 가지고 있으며, 당신은 당신의 맥락에서 이들의 컬렉션을 얻으 려합니다. 그것이 추상 클래스 일 때 EF가 쿼리 결과를 구체화 할 수 있도록 하나 이상의 파생 클래스 (discriminator 열에 의해 정의 됨)가 있어야합니다. 이 인터페이스 인 경우

, 당신은 인터페이스 그러나 그것을 구현하는 클래스를 매핑하지 않아야합니다.