3

このオブジェクトを操作しようとすると、次のエラーが発生します。誰かアイデアはありますか?プロジェクトは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
4

2 に答える 2

2

これは非常に役立つエラー メッセージです。

抽象型 'QuickFix.Fields.IField' にはマップされた子孫がないため、マップできません。モデルから「QuickFix.Fields.IField」を削除するか、「QuickFix.Fields.IField」から派生した 1 つ以上のタイプをモデルに追加してください。

どうやら抽象クラス (インターフェース?)IFieldを持っていて、コンテキストからこれらのコレクションを取得しようとしているようです。抽象クラスの場合、EF がクエリ結果を実体化できるようにするには、1 つ以上の派生クラス (識別子列によって定義される) が必要です。

インターフェイスの場合は、インターフェイスをマップするのではなく、それを実装するクラスをマップする必要があります。

于 2012-09-25T16:59:54.930 に答える
2

QuickFix Message オブジェクトは単純な DTO ではないため、ORM を使用したデータベースへのマッピングには適していません。QuickFix は、FIX フィールド タイプごとに異なる IField 派生クラスを定義します。これは、IField インターフェイスをデータベースと個々のフィールド タイプの両方にマップする必要があることを意味します。

さらに悪いことに、QuickFix/N は Java からのポートであり、プロパティの代わりに getter/setter メソッドを使用するなど、マッピングを非常に困難にする多くの Javaism があります。追加の障害は、FIX バージョンごとに個別の名前空間があることです。つまり、すべての FIX バージョンのメッセージを保持したい場合は、多少同一のクラスを持つ 4 ~ 5 個の異なる名前空間をマップする必要があります。

はるかに優れたオプションは、データベースにマップし、QuickFix メッセージ オブジェクトから DTO に変換できる個別の DTO オブジェクトを作成することです。幸いなことに、QuickFix には、コード ジェネレーターを使用して DTO を生成するために使用できる XML 形式の FIX のさまざまなバージョンのデータ ディクショナリが含まれています。

変換を簡単にするために、AutoMapper などの規則ベースのツールを使用し、変換コードを自分で記述せずに QuickFix オブジェクトを DTO に変換できます。

于 2012-12-12T14:29:14.950 に答える