5

最初にコードを使用して、2つのエンティティを同じテーブルにマップする方法に興味があります。次に例を示します。

public class User
{
    [Key]
    public int UserId { get; set; }
    public string Name { get; set; }
    public byte Age { get; set; }
    public bool Active { get; set; }
    public DateTime Created { get; set; }
}

public class UserViewModel
{
    [Key]
    public int UserId { get; set; }
    public string Name { get; set; }
    public byte Age { get; set; }
}

基本的に、私はリポジトリの構築にうんざりしています。modelbuilderの構成ポータル、ユーザーポータル、その他のサービスのすべての可能なモデルをマップし、すべてにDbContextを使用したいと思います。Userクラスを階層の最上位に設定し、データベースを構築するクラスを設定したいのですが、他のすべてのモデルはさまざまなアプリケーション用に存在する必要があります。

オートマッパーは使いたくない。また、かなりの量の手動コーディングを行ったため、時間が無駄になりました。変更を加えるたびに、リポジトリに戻って再コーディングする必要があります。これは煩わしいことです。

これをmodelbuilderで使用しようとしましたが、階層が無効であるという警告が表示されます。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().Map(p => { p.ToTable("Users"); });
        modelBuilder.Entity<UserViewModel>().Map(p => { p.ToTable("Users"); });
    }

また、私は「テーブル分割」を実現しようとしているのではないことにも注意してください。テーブルを2つのエンティティに分割したくないので、主キーを持つ列を除いてすべての列をnull許容にし、さまざまなアプリケーション/Webサービス/Webポータルが許可された量のデータを入力できるようにします。のアクセス。

すべてのヒントをありがとう:)

4

2 に答える 2

10

できません。1つのテーブル=1つのエンティティ(前述のテーブル分割やTPH継承などの高度なマッピングを除く)。ビューモデルはエンティティではありません。データ/投影のビューにすぎないので、そのように処理します。常にユーザーおよびプロジェクトユーザーと協力して、必要なモデルを表示します。

var view = from u in context.Users
           select new UserViewModel
              {
                  UserId = u.UserId,
                  Name = u.Name,
                  Age = u.Age
              };

これを再利用可能なメソッドリターンとして作成するIQueryable<UserViewModel>と、やりたいことが何でもできます。

于 2012-05-04T08:29:10.287 に答える
1

最初にコードを使用したエンティティフレームワークでの階層ごとのテーブルTPH継承

https://www.youtube.com/watch?v=2i7jahkpeQ8&list=PL6n9fhu94yhUPBSX-E2aJCnCR3-_6zBZx&index=19

于 2015-11-20T12:49:13.360 に答える