6

レガシ データベースを Entity Framework モデルにマップしようとしています。データベースは非常に汎用的で、ほとんどのデータはテーブル「オブジェクト」と「イベント」に保存されます。列には、「Date1」、「Num11」、「Text4」などの名前が付けられています。データベースに定義された明示的な外部キーはありません。

2 つのテーブルのサブセットを次に示します。

CREATE TABLE [Object] (
    [ObjectId] int not null identity(1,1) primary key,
    [ObjectTypeId] int,
    [Name] varchar(100)
);

CREATE TABLE [Event] (
    [EventId] int not null identity(1,1) primary key,
    [EventTypeId] int,
    [Subject] text,
    [Body] text,
    [Date1] datetime,
    [Num11] decimal(18,2)
);

の一部の値でEventTypeIDは、Num11フィールドは を参照しObjectます。テーブル間の結合を簡単に作成できます。

SELECT
    ev.[EventId], ev.[Subject], ev.[Body], ev.[Date1] AS [CreatedDate],
    p.[ObjectId] AS [PersonId], p.[Name] AS [PersonName]
FROM [Event] ev
LEFT JOIN [Object] p ON p.ObjectId = ev.Num11
WHERE ev.[EventTypeId] = 7
AND ev.[Date1] > '2013-04-07'

Entity Framework デザイナーでは、オブジェクトの種類ごとに個別のエンティティを作成し、列の名前を適切に変更できます。外部キー列のタイプが主キーと常に一致するとは限らないため、エンティティ間にナビゲーション プロパティを作成しようとすると問題が発生します。

SQL Server も Entity Framework も、列間に外部キー参照を作成することを許可しません。

FK データ型と PK データ型が正確に一致しない場合、エンティティ間にナビゲーション プロパティを作成するにはどうすればよいですか? 関連するエンティティを LINQ クエリに含めることができ、うまくいけば OData サービスで公開できるようになります。

データベース内の既存のテーブルを変更することはできませんが、必要に応じてビューを追加できます。エンティティをデータベースに保存できるようにする必要がありますが。

4

2 に答える 2

5

楽しいデザインではありませんが、いくつかのオプションが残っています。これはあなたができることです:

  • Event小数を整数に変換する列を追加して、1:1 ビューを作成します。プロパティは計算済みとしてマークする必要があります。
  • との FK 関連付けでプロパティを使用するObjectため、(必要に応じて) ビューにマップされるObjectナビゲーション プロパティがあります。EventViewItems( edmx デザイナーで関連付けを手動で追加し、外部キー フィールドを微調整する必要があります)。
  • 次のような1つのlinqステートメントでオブジェクトとイベントを読み取りますdb.Objects.Include(o => o.EventViewItems)

しかし、あなたはできません

  • db.Objects.EventViewItemsFK フィールドには書き込めないため、にイベントを追加します。
  • db.EventViewItemsビューに InsertFunction が定義されていないため、イベントを追加してください。(ビューをテーブルとしてモデルにハックしない限り)。

したがって、モデルにもオリジナルを含め、それを使用して個々のオブジェクトEventを作成/更新/削除 (CUD) する必要があります。Event

実行時例外が発生しないようにステップを監視する必要があるため、不安定に感じます。一方、読み取りと CUD には別々のパスがあります。それを CQRS と呼ぶと、この設計は突然最先端になります。

于 2013-04-08T12:48:26.973 に答える