24

予約システム (ゼロから作成) に Entity Framework をすぐに使用する予定です。

私はいくつかのプロトタイプを作成し、プロジェクトが開始される前に何をしたいのかを理解しようとしています (まだクライアントと要件などについて話し合っています)。

このケースを考えてみましょう:

予約があり、予約には予約可能なリソースが関連付けられている可能性がありますが、これらのリソースは異なる場合があり、フィールドが異なる場合があります。

関係のER図

私はこれまで EF を実際に使用したことがないため、他のプロジェクト (生の SQL を使用している) で慣れているこの種のポリモーフィズムをどのように達成できるかわかりません。

C# モデルは次のようになります。

public class Booking
{
    public int BookingID { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    public IRessource Ressources { get; set; }
    ...
}

public interface IRessource
{
    public int RessourceTypeId { get; set; }
}

public class Room : IRessource
{
    public int RoomID { get; set; }
    public int RessourceTypeId { get; set; }
    ...
}

public class Car : IRessource
{
    public int CarID { get; set; }
    public int RessourceTypeId { get; set; }
    ...
}

これは達成可能ですか?達成可能である場合、その方法は? クエリはどのように見えるでしょうか?

4

1 に答える 1

26

そのとおり。

Table Per Type (TPT)関係が本当に必要なようです。これは、標準is-a / has-aの外部キー関係を表します。デフォルトでは、Entity Framework は Table Per Hierarchy (TPH) を使用することに注意してください。

ここにいくつかのリンクがあります:

これらのリンクのいくつかを自分で確認することを強くお勧めしますが、抽出する主なポイントは次のようなものを使用することです:

modelBuilder.Entity<IRessource>().ToTable("IRessources");
modelBuilder.Entity<Room>().ToTable("Rooms");
modelBuilder.Entity<Car>().ToTable("Cars");

どちらも、IRessource上記のデモ コードから継承されます。次に、これらの個々のテーブルと中央のIRessourceテーブルを結合して、個々のエンティティに関するすべての情報を取得できます。

何かのようなもの:SELECT * FROM IRessource i JOIN Room r ON i.id == r.id

ただし、Web APIコントローラーを使用する場合、POCO 全体をプルするだけRoomで、結合をまったく行わずにすべてのプロパティを一度に取得できることがよくあります。


私の経験では、インターフェイスや抽象クラスを使用しない方が通常はスムーズに進むこともわかりました。インスタンス化できないため、データ転送オブジェクト (DTO) を作成してデータを転送する必要があるためです。それらのタイプのオブジェクト。特に、自分が何をしているのか正確にわからない場合は特にそうです。理解を助けるために、ジェネリックに渡したいコントローラーを考えてIRressourceみてください。これらのオブジェクトを受け取ると、それらのオブジェクトをインスタンス化できないものに変換しようとします。残念!したがって、簡単な解決策は、基本クラスと継承クラスの両方を通常のクラスにすることです。

于 2013-09-19T20:51:24.413 に答える