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

我当然不会这样做,通过传递身份框架是可能的..但为什么这样... –