0

數據庫檢索數據時訪問的用戶身份的附加屬性可以說我使用asp.net的身份時,增加了幾個附加屬性設置爲默認用戶:使用EF和LINQ

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字段的項目,但我想在視圖中顯示Created by:FirstName + LastName。

如何獲取這些額外信息?如果我使用的是純SQL,那麼我會在AspNetUsers表上創建一個名爲CreatedBy = Username的INNER JOIN,並簡單地在名爲CreatedByFullName的自定義列中檢索FirstName和LastName。

因爲我現在正在使用實體框架以及最新版本的ASP.NET身份,所以我有點困惑於我們如何檢索用戶信息以顯示在我們頁面的視圖中。是在我的資源庫中與linq進行連接的問題,還是僅將一個對象添加到每個名爲ApplicationUser的屬性中?或者有更好的方法嗎?

+0

我想你可能正在尋找...[ASP MVC5 - 身份。如何獲取當前ApplicationUser](http://stackoverflow.com/questions/20925822/asp-mvc5-identity-how-to-get-current-applicationuser)。 –

+0

@ErikPhilips獲取當前的應用程序用戶不是我所需要的。我需要一種從所有對象中的CreatedBy字段(包含字符串用戶名)到讓所有創建實體信息的用戶在視圖中顯示的方式。有點像StackOverflow如何顯示每個帖子在這裏創建的人 –

+1

您是否已經創建了這些對象(具有CreatedBy的對象)的*指向* ApplicationUsers表的導航屬性?如果是這樣,一個簡單的'.Include(x => x.CreatedByUser)'是你需要的所有代碼。 –

回答

2

假設:

  • 你有一個名爲提交該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 Documentation。授予上面的代碼我幾乎只是寫下了我的頭頂,所以我可能不完全正確。

如果你想,我所說的,雙向的導航性能:

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(); 
} 

這真的只是取決於您的需求。但becareful,你可以結束與知道所有關係的巨人God DbContext ...

+0

好,所以技巧是在我的DbConext中編輯modelBuilder。如果你看到我上面的最後一條評論,我想知道如何告訴EF有關這個連接。 –

+0

您也可以使用[ForeignKeyAttribute](https://msdn.microsoft.com/zh-cn/data/jj591583.aspx),但我不想將元數據添加到我的Poco對象。 –

+0

我同意,明白了!謝謝!您是否從文檔中提取了該模型構建器示例?如果是這樣,我想知道哪一部分。 WithMany()部分的目的是什麼?我使用EF7的數字並沒有任何這些選項。我將不得不做一些研究並找到相應的東西。 –

0

樣品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(); 
+0

你認爲這是我應該這樣做的方式嗎?我是否想要將ApplicationUser的屬性添加到我的對象以使其變得複雜?在大多數情況下,我只是使用Include來填充我的複雜對象,但在這種情況下,我不能使用include right? –

+0

我當然不會這樣做,通過傳遞身份框架是可能的..但爲什麼這樣... –