2012-05-01 7 views
1

この質問は、コントローラのことです。このコードは、コードファーストエンティティフレームワークアプローチを使用してモデルの関連付けと継承で生成されるコードです。ASP.NET MVC 3モデル継承を使用したコントローラの作成

私は次のモデルのセットアップと関連付けと継承を持っています。

[Table("User")] 
public class User { 
    [Key] 
    public int UserId { get; set; } 
    public string Username { get; set; } 
} 

[Table("UserProfile")] 
public class UserProfile { 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    [Key, ForeignKey("User")] 
    public int UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public virtual User User { get; set; } 
} 

[Table("Client")] 
public class Client : UserProfile { 
    public bool Approved { get; set; } 
} 

私はその後、私のコンテキストクラスに、「クライアント」にModelクラスおよびデータコンテキストクラス「Entity Frameworkのを使用して、読み取りとコントローラ/アクションとビューを作成する」にテンプレートを設定し、VS2010でコントローラを生成します。

これは、次のIndexメソッドを生成します。

public class ClientController : Controller { 
    private DataContext db = new DataContext(); 
    public ViewResult Index() { 
    var users = db.UserProfiles.Include(u => u.User); 
    return View(users.ToList()); 
    } 
    ... 
} 

どうして次のようにはなりませんか?

public class ClientController : Controller { 
    private DataContext db = new DataContext(); 
    public ViewResult Index() { 
    var users = db.Clients.Include(u => u.User); 
    return View(users.ToList()); 
    } 
    ... 
} 

またはこれは多分ですか?

public class ClientController : Controller { 
    private DataContext db = new DataContext(); 
    public ViewResult Index() { 
    var users = db.UserProfiles.OfType<Client>().Include(u => u.User); 
    return View(users.ToList()); 
    } 
    ... 
} 

また、作成方法は、以下を使用しない理由は、私が思っていた

db.UserProfiles.Add(client); 

を使用していますか?

db.Clients.Add(client); 

どのアプローチを使用するべきですか?

答えて

2

答えは、エンティティ・フレームワークがモデルで継承をどのように処理するかにあります。このシナリオは「階層ごとの表」継承と呼ばれます。コードを実行し、生成されたテーブルを見ると、UserProfileとクライアントデータの両方が1つのテーブルにのみ格納されていることがわかります。このモデルのように、型オブジェクトであることを理解するために差別化カラムが使用されますが、両方のデータが1つのテーブルにのみ格納されます。したがって、階層ごとのシナリオでは、コントローラースタブは基本クラスモデルのみで生成されます。

これはあなたのより良い洞察力を与えることができます。

http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

OfType()が使用されていない理由はわからないが、VSだけ一般化コードを生成しているようです。

+0

このインスタンスでは、継承のためにdb.UserProfiles.OfType ()。インクルード(u => u.User)とdb.UserProfiles.Add(クライアント)を使用する必要がありますか? –

+0

いいえ、db.Client.Add(クライアント)のみを使用しますが、問題はありませんが、データは単一の表にのみ格納されます。「UserProfiles」とその中に弁別子「client」があります。すべてこれは自動的に起こります。 db.UserProfiles.OfType またはdb.clientの両方を使用できますが、どちらも同じ結果を返します。 Visual Studioによって生成されたコードは、内部的な制限があるためです。開発者にはこのような制限はありません。 –

関連する問題