EFおよびLinqを使用してデータベースからデータを取得するときにIdentityユーザーの追加プロパティにアクセスする

asp.net asp.net-identity asp.net-mvc c# entity-framework-core

質問

asp.net IDを使用するときに、デフォルトのUserにいくつかの追加のプロパティを追加したとします。

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

私は、私のasp.net MVCコントローラでは、現在ログインしているユーザーの名前を取得するために次の操作を行うことができます。

User.Identity.Name

だから、データベースに保存するときに、保存しているオブジェクトと一緒に私のリポジトリにUser.Identity.Nameを渡すだけで、CreatedByフィールドに値を設定することができます。

さて、データベースから、ユーザー名の文字列を含むCreatedByのフィールドを持つアイテムを取得しているとしますが、作成者:FirstName + LastNameを表示したいとします。

この追加情報を入手するにはどうすればよいですか?純粋なSQLを使用していた場合、CreatedBy = UsernameがあるAspNetUsersテーブルでINNER JOINを実行し、CreatedByFullNameという名前のカスタム列でFirstNameとLastNameを取得するだけです。

Entity FrameworkをASP.NET IDの最新バージョンとともに使用しているので、私たちのページのビューに表示するユーザー情報を取得する方法について少し混乱しています。私のリポジトリでlinqとの結合を行うか、単にApplicationUserという各プロパティにオブジェクトを追加するか、より良い方法がありますか?

受け入れられた回答

前提条件:

  • すべてのユーザーを含むApplicationUserという単一のテーブルがあります。
  • このテーブルには、他のテーブルにルックアップを格納するために再利用するIdカラム(int)があります。

他のクラス(私が単方向ナビゲーションプロパティと呼ぶもの):

public class BookContext : DbContext
{
    public DbSet<Book> Books { get; set; }
    public Dbset<ApplicationUser> Users { get; set; }

    public overridee OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Book>()
        .HasRequired(b => b.CreatedByUser)
        .WithMany()
        .HasForeignKey(b => b.CreatedBy);
    }
}

public class Book
{
  public int CreatedBy { get; set; }
  public virtual ApplicationUser CreatedByUser { get; set; }
}

それから、あなたは単に

using (var bookContext = new BookContext())
{
  var firstBookWithRelatedUser bookContext.Books
    .Include(b => b.CreatedByUser)
    .First();
}

そんな感じ。 Entity Frameworkのドキュメントを読むことをお勧めします。私はちょうど私の頭の上を書いたので、私はまさにそうでないかもしれない上記のコードを与えた。

あなたが望むなら、私が何を呼んでいるか、双方向ナビゲーションプロパティ:

public class ApplicationUser : IdentityUser
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public ICollection<Book> Books { get; set; }
}

次に

    public overridee OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Book>()
        .HasRequired(b => b.CreatedByUser)
        .WithMany(u => u.Books)
        .HasForeignKey(b => b.CreatedBy);
    }

それから、あなたは単に

using (var bookContext = new BookContext())
{
  var firstUserWithAllRelatedBooks = bookContext.Users
    .Include(u => u.Books)
    .First();
}

それは本当にあなたのニーズにかかっています。しかし、あなたはすべての関係を認識している巨大な神の DbContextで終わることができます...


人気のある回答

サンプルのEFクエリは以下のようになります -

var result = (from tab in db.YourTable
            join user in db.AspNetUsers on user.username equals tab.CreatedBy                
            select new {YourTableObj = tab, CreatedByFullName = user.FirstName + " " + user.LastName).ToList();


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ