1

この質問は、Code First Entity Framework Approach を使用してモデルの関連付けと継承で生成されるコードである Controllers に関するものです。

関連付けと継承を使用して次のモデルをセットアップしています。

[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; }
}

次に、VS2010でコントローラーを生成し、テンプレートを「Entity Frameworkを使用して読み取り/書き込みアクションとビューを備えたコントローラー」に設定し、モデルクラスを「クライアント」に、データコンテキストクラスをコンテキストクラスに設定します。

これにより、次の 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());
  }
  ...
}

また、Create メソッドは

db.UserProfiles.Add(client);

以下が使用されないのはなぜだろうと思っていました。

db.Clients.Add(client);

どのアプローチを使用すべきかについての推奨事項はありますか?

4

1 に答える 1

2

その答えは、エンティティ フレームワークがモデルの継承を処理する方法にあります。このシナリオは、「階層ごとのテーブル」継承と呼ばれます。コードを実行して生成されたテーブルを確認すると、UserProfile とクライアント データの両方が 1 つのテーブルにのみ格納されていることがわかります。このモデルのように、タイプ object が何であるかを理解するために差別化列が使用されますが、両方のデータは 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 は一般化されたコードしか生成しないようです。

于 2012-05-01T16:56:03.747 に答える