1

私がこのように質問したのは、潜在的に簡単であるが Devart 固有の解決策があると想像できるためですが、同様の状況に対する非常に一般的な解決策もあるかもしれません。

私は Devart LINQ To Oracle を使用しています。通常ItemX、設計時に lqml ファイルのようなクラスを作成し、その背後にあるテーブルを指定します。次に、実行時に aTable(Of ItemX)を使用してデータベースにクエリを実行します。ここまでは順調ですね。

今、2 つの同一のテーブルがItemXありItemY、ランタイム フラグに応じて、どちらか一方からクエリを実行する必要がある状況があります。これ以外は、すべてのコードは同一であり、そのまま維持したいと考えています。ただし、Table(Of ItemX)は厳密に型指定されているため、すべてのバージョンを複製する必要があり、唯一の違いはデータ型です。

したがって、Devart 固有の解決策は次のようになります。1 つのアイテム クラスを単に と呼びItemますが、実行時に何かを実行して、Devart DataContext が別のバッキング テーブルを使用するようにします。次に、すべてのコードでベースItemオブジェクトが使用されますが、データベースとの間で永続化する場合は、使用するテーブルが認識されます。これを行う方法はありますか?

より一般的なアプローチは、IQueryable チェーンにフックして、クラスItemXItemYクラスを内部で使用し、すべてをItem外部シグネチャの基本クラスに変換する方法です。ただし、質問を表現するのに十分なほど明確に想像することさえできません。これを達成する方法はありますか?

4

1 に答える 1

1

このシナリオは、基本クラス (どのテーブルにもマップされていない) とその 2 つの「単純な」子孫 (それぞれが作業するテーブルの 1 つにマップされている) を手動で作成することによって実装できます。

より正確には、次の手順を実行する必要があります。

  • いずれかのテーブルに対応するエンティティ クラスを持つモデルを生成します。
  • このエンティティ クラスを生成されたコードから別の場所に移動します。
  • このクラスから Table 属性を削除します。
  • (オプション) クラスの名前を「ItemBase」などに変更します。
  • このクラスの 2 つの public 子孫 (たとえば、'ItemX' と 'ItemY') を宣言します。
  • これらの各子孫の適切なテーブルを指す Table 属性を設定します。
  • DataContext クラスの 'ItemBases' プロパティ (Devart.Data.Linq.Table オブジェクトを返すもの。もちろん、別の名前が付いている場合もあります) を削除し、代わりに Table と Table を返す類似のプロパティを追加します。

したがって、これは次のようになります

namespace MyContext {

  public partial class ItemBase : INotifyPropertyChanging, INotifyPropertyChanged {
    ... // Generated code.
  }

  [Table(Name = @"ItemXs")]
  public partial class ItemX : ItemBase {}

  [Table(Name = @"ItemYs")]
  public partial class ItemY : ItemBase {}

  public partial class MyDataContext {

    public Devart.Data.Linq.Table<ItemX > ItemXs {
      get { return this.GetTable<ItemX>(); }
    }

    public Devart.Data.Linq.Table<ItemY> ItemYs {
      get { return this.GetTable<ItemY>(); }
    }
  }

}
于 2012-02-09T16:15:08.303 に答える