使用EF和Linq從數據庫檢索數據時訪問Identity用戶的其他屬性

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

假設我在使用asp.net標識時向默認用戶添加了幾個附加屬性:

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字段的項目,該字段包含用戶名的字符串,但我想在View中顯示Created by:FirstName + LastName。

我如何獲得這些額外信息?如果我使用純SQL,我會在AspNetUsers表上進行INNER JOIN,其中CreatedBy = Username,只需在名為CreatedByFullName的自定義列中檢索FirstName和LastName。

由於我現在使用Entity Framework以及最新版本的ASP.NET Identity,我對如何檢索用戶信息以顯示在我們的頁面視圖中感到困惑。是在我的存儲庫中使用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();
}

這樣的事情。我建議閱讀實體框架文檔 。在上面的代碼中,我幾乎只是寫下了我的頭腦,所以我可能不完全正確。

如果您願意,我稱之為雙嚮導航屬性:

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合法嗎? 是的,了解原因