5

.NET 4.0 Entity Framework を検討している開発時間を短縮するために、古い ASP アプリケーションを最新の .NET バージョンに移行しています。しかし、この問題で私たちの開発はレンガの壁にぶち当たったようです。

与えられたのは私たちのデータベースの小さな部分です: 車とそれぞれのプロパティのリストを含むテーブル OBJECT です。OBJECT 内の特定の車について、OPTIONS、ACCESSORIES、および STANDARD EQUIPMENT のリストを含むテーブル OBJECT_OPTIONS もあります。これら 3 つのタイプはすべて同じフィールドを持っているため、同じテーブルに格納されます。列 ncopt_type は、異なるリストを区別するために使用されます。可能な値は次のとおりです。「opt」、「acc」、および「sta」。テーブル OBJECT_OPTIONS は、テーブル OBJECT 内の一意の車 (obj_id) を表す ncopt_obj_id を介して OBJECT にリンクします。

私たちの目標は、異なる OBJECT_OPTIONS リストにリンクする 3 つのプロパティを OBJECT エンティティに提供することです。 - プロパティ OPTIONS - プロパティ ACCESSORIES - プロパティ STANDARDEQUIPMENT

継承モデルによる階層ごとのテーブルに関するさまざまなチュートリアルとウォークスルーを試しましたが、構築可能なモデルを作成することに成功していません。

技術的には、次のことを行いました。

  • エンティティ OBJECT の作成
  • エンティティ OBJECT_OPTIONS を作成し、抽象化します
  • ベースタイプ OBJECT_OPTIONS を使用してエンティティ OPTION、ACCESSORY、および STANDARD_EQUIP をすべて追加します
  • ncopt_type = '...' で 3 つのテーブルすべてに条件を追加します。
  • OBJECT に 3 つのナビゲーション プロパティを追加し、すべて継承されたエンティティの 1 つにリンクします: OPTIONS、ACCESSORIES、STANDAARD_EQUIPMENT

このセットアップ中に一連のエラーが表示されますが、最終的には次のエラーになります。

エラー 3032: 行 250、286 で始まるフラグメントのマッピングの問題:EntityTypes NCO.Model.OPTION、NCO.Model.ACCESSOIRE、NCO.Model.STANDAARD_EQUIP がテーブル OBJECT_OPTIES の同じ行にマップされています。マッピング条件を使用して、これらのタイプがマップされる行を区別できます。

ただし、3 つのオブジェクトすべてに条件が存在します。

私はこの問題の解決策を見つけられず、すでに多くの時間を費やしてきました。現在、回避策を使用していますが、プロジェクトの終了までにこの状況がさらに数回発生するため、これを修正したいと考えています。

さらに詳しい情報が必要な場合は、コメントまたはメールをお送りください。

4

1 に答える 1

1

EFデザイナー内からこれを100%実行できるとは確信していませんが、次のように実行できます。

  1. エンティティ OBJECT を作成します (この例では、この「車両」の名前を変更しました)
  2. エンティティ OBJECT_OPTIONS を作成し、抽象化します
  3. ベースタイプ OBJECT_OPTIONS を使用してエンティティ OPTION、ACCESSORY、および STANDARD_EQUIP をすべて追加します
  4. ncopt_type = '...' で 3 つのテーブルすべてに条件を追加します。

次に、Vehicle の部分クラスを使用して必要なプロパティを追加します。

using System.Collections.Generic;
using System.Linq;

public partial class Vehicle
{
    public IEnumerable<ACCESSORY> Accessories
    {
        get { return this.OBJECT_OPTIONS.OfType<ACCESSORY>(); }
    }

    public IEnumerable<OPTION> Options
    {
        get { return this.OBJECT_OPTIONS.OfType<OPTION>(); }
    }

    public IEnumerable<STANDARD_EQUIP> StandardEquipments
    {
        get { return this.OBJECT_OPTIONS.OfType<STANDARD_EQUIP>(); }
    }
}
于 2011-04-23T12:39:45.870 に答える