使用 EF 和 Linq 从数据库中检索数据时访问身份用户的其他属性
Accessing additional properties of an Identity user when retrieving data from the database using EF and Linq
假设我在使用 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 字段,但我想在视图中显示创建者:FirstName + LastName。
我如何获得这些额外信息?如果我使用的是纯 SQL,我会在 AspNetUsers table 上执行 INNER JOIN,其中 CreatedBy=Username 并在名为 CreatedByFullName 的自定义列中简单地检索 FirstName 和 LastName。
由于我现在使用的是 Entity Framework 以及最新版本的 ASP.NET Identity,所以我对我们应该如何检索用户信息以显示在我们页面的视图中感到有点困惑。是在我的存储库中使用 linq 进行连接,还是简单地向我的每个名为 ApplicationUser 的属性添加一个对象,还是有更好的方法?
示例 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();
假设:
- 您有一个名为
ApplicationUser
的 tabled,其中包含您的所有用户。
- 此 table 有一个
Id
column(int),您正在重复使用它来在其他 table 中存储查找。
其他类(我称之为单向导航属性):
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();
}
这实际上取决于您的需要。但是要小心,你最终可能会得到一个知道所有关系的巨人 God DbContext...
假设我在使用 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 字段,但我想在视图中显示创建者:FirstName + LastName。
我如何获得这些额外信息?如果我使用的是纯 SQL,我会在 AspNetUsers table 上执行 INNER JOIN,其中 CreatedBy=Username 并在名为 CreatedByFullName 的自定义列中简单地检索 FirstName 和 LastName。
由于我现在使用的是 Entity Framework 以及最新版本的 ASP.NET Identity,所以我对我们应该如何检索用户信息以显示在我们页面的视图中感到有点困惑。是在我的存储库中使用 linq 进行连接,还是简单地向我的每个名为 ApplicationUser 的属性添加一个对象,还是有更好的方法?
示例 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();
假设:
- 您有一个名为
ApplicationUser
的 tabled,其中包含您的所有用户。 - 此 table 有一个
Id
column(int),您正在重复使用它来在其他 table 中存储查找。
其他类(我称之为单向导航属性):
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();
}
这实际上取决于您的需要。但是要小心,你最终可能会得到一个知道所有关系的巨人 God DbContext...