C# 如何使用IdentityUser和实体框架加载链接实体
我目前正在编写一个小型测试应用程序,以了解IdentityUser是如何工作的 我创建了一个从IdentityUser继承的MyUser类。自定义用户类上唯一的附加属性是我的书籍类的集合 我在控制器上创建了一些方法,成功地将新用户存储到数据库和相关书籍中。问题是,当我试图检索一个用户时,该用户的图书集合没有填充-它总是空的 当我检查数据库时,我可以看到数据库中存储了一本带有相关用户ID的书,但是我似乎无法检索此集合 以下是我到目前为止的情况: Book.cs:C# 如何使用IdentityUser和实体框架加载链接实体,c#,.net,C#,.net,我目前正在编写一个小型测试应用程序,以了解IdentityUser是如何工作的 我创建了一个从IdentityUser继承的MyUser类。自定义用户类上唯一的附加属性是我的书籍类的集合 我在控制器上创建了一些方法,成功地将新用户存储到数据库和相关书籍中。问题是,当我试图检索一个用户时,该用户的图书集合没有填充-它总是空的 当我检查数据库时,我可以看到数据库中存储了一本带有相关用户ID的书,但是我似乎无法检索此集合 以下是我到目前为止的情况: Book.cs: public class Book
public class Book
{
public int Id { get; set; }
public string Isbn { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
public class MyUser : IdentityUser
{
public IList<Book> Books { get; set; }
}
public class MyAppContext : IdentityDbContext<MyUser>
{
public MyAppContext() : base("MyApp")
{
}
public DbSet<Book> Books { get; set; }
}
public class AuthRepository : IDisposable
{
private MyAppContext _ctx;
private UserManager<MyUser> _userManager;
public AuthRepository()
{
_ctx = new MyAppContext();
_userManager = new UserManager<MyUser>(new UserStore<MyUser>(_ctx));
}
public async Task<IdentityResult> RegisterUser(RegistrationModel userModel)
{
MyUser user = new MyUser();
user.UserName = userModel.UserName;
var result = await _userManager.CreateAsync(user, userModel.Password);
return result;
}
public async Task<IdentityResult> UpdateUser(MyUser userModel)
{
var result = await _userManager.UpdateAsync(userModel);
return result;
}
public async Task<MyUser> FindUser(string userName, string password)
{
var user = await _userManager.FindAsync(userName, password);
return user;
}
public async Task<MyUser> GetUser(string userName)
{
var user = await _userManager.FindByNameAsync(userName);
return user;
}
public void Dispose()
{
_ctx.Dispose();
_userManager.Dispose();
}
}
MyUser.cs:
public class Book
{
public int Id { get; set; }
public string Isbn { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
public class MyUser : IdentityUser
{
public IList<Book> Books { get; set; }
}
public class MyAppContext : IdentityDbContext<MyUser>
{
public MyAppContext() : base("MyApp")
{
}
public DbSet<Book> Books { get; set; }
}
public class AuthRepository : IDisposable
{
private MyAppContext _ctx;
private UserManager<MyUser> _userManager;
public AuthRepository()
{
_ctx = new MyAppContext();
_userManager = new UserManager<MyUser>(new UserStore<MyUser>(_ctx));
}
public async Task<IdentityResult> RegisterUser(RegistrationModel userModel)
{
MyUser user = new MyUser();
user.UserName = userModel.UserName;
var result = await _userManager.CreateAsync(user, userModel.Password);
return result;
}
public async Task<IdentityResult> UpdateUser(MyUser userModel)
{
var result = await _userManager.UpdateAsync(userModel);
return result;
}
public async Task<MyUser> FindUser(string userName, string password)
{
var user = await _userManager.FindAsync(userName, password);
return user;
}
public async Task<MyUser> GetUser(string userName)
{
var user = await _userManager.FindByNameAsync(userName);
return user;
}
public void Dispose()
{
_ctx.Dispose();
_userManager.Dispose();
}
}
公共类MyUser:IdentityUser
{
公共IList书籍{get;set;}
}
MyAppContext.cs:
public class Book
{
public int Id { get; set; }
public string Isbn { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
public class MyUser : IdentityUser
{
public IList<Book> Books { get; set; }
}
public class MyAppContext : IdentityDbContext<MyUser>
{
public MyAppContext() : base("MyApp")
{
}
public DbSet<Book> Books { get; set; }
}
public class AuthRepository : IDisposable
{
private MyAppContext _ctx;
private UserManager<MyUser> _userManager;
public AuthRepository()
{
_ctx = new MyAppContext();
_userManager = new UserManager<MyUser>(new UserStore<MyUser>(_ctx));
}
public async Task<IdentityResult> RegisterUser(RegistrationModel userModel)
{
MyUser user = new MyUser();
user.UserName = userModel.UserName;
var result = await _userManager.CreateAsync(user, userModel.Password);
return result;
}
public async Task<IdentityResult> UpdateUser(MyUser userModel)
{
var result = await _userManager.UpdateAsync(userModel);
return result;
}
public async Task<MyUser> FindUser(string userName, string password)
{
var user = await _userManager.FindAsync(userName, password);
return user;
}
public async Task<MyUser> GetUser(string userName)
{
var user = await _userManager.FindByNameAsync(userName);
return user;
}
public void Dispose()
{
_ctx.Dispose();
_userManager.Dispose();
}
}
公共类MyAppContext:IdentityDbContext
{
公共MyAppContext():基(“MyApp”)
{
}
公共数据库集书籍{get;set;}
}
AuthRepository:
public class Book
{
public int Id { get; set; }
public string Isbn { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
public class MyUser : IdentityUser
{
public IList<Book> Books { get; set; }
}
public class MyAppContext : IdentityDbContext<MyUser>
{
public MyAppContext() : base("MyApp")
{
}
public DbSet<Book> Books { get; set; }
}
public class AuthRepository : IDisposable
{
private MyAppContext _ctx;
private UserManager<MyUser> _userManager;
public AuthRepository()
{
_ctx = new MyAppContext();
_userManager = new UserManager<MyUser>(new UserStore<MyUser>(_ctx));
}
public async Task<IdentityResult> RegisterUser(RegistrationModel userModel)
{
MyUser user = new MyUser();
user.UserName = userModel.UserName;
var result = await _userManager.CreateAsync(user, userModel.Password);
return result;
}
public async Task<IdentityResult> UpdateUser(MyUser userModel)
{
var result = await _userManager.UpdateAsync(userModel);
return result;
}
public async Task<MyUser> FindUser(string userName, string password)
{
var user = await _userManager.FindAsync(userName, password);
return user;
}
public async Task<MyUser> GetUser(string userName)
{
var user = await _userManager.FindByNameAsync(userName);
return user;
}
public void Dispose()
{
_ctx.Dispose();
_userManager.Dispose();
}
}
公共类AuthRepository:IDisposable
{
私有MyAppContext ctx;
私人用户管理器(UserManager);;
公共AuthRepository()
{
_ctx=新的MyAppContext();
_userManager=newusermanager(newuserstore(_ctx));
}
公共异步任务注册表服务器(RegistrationModel userModel)
{
MyUser=新的MyUser();
user.UserName=userModel.UserName;
var result=await\u userManager.CreateAsync(user,userModel.Password);
返回结果;
}
公共异步任务更新器(MyUser userModel)
{
var result=await\u userManager.UpdateAsync(userModel);
返回结果;
}
公共异步任务FindUser(字符串用户名、字符串密码)
{
var user=await\u userManager.FindAsync(用户名、密码);
返回用户;
}
公共异步任务GetUser(字符串用户名)
{
var user=await\u userManager.FindByNameAsync(用户名);
返回用户;
}
公共空间处置()
{
_ctx.Dispose();
_userManager.Dispose();
}
}
我想也许在GetUser()方法中,我可以使用_ctx.books.Where(b=>b.MyUser_id==user.id)手动检索Book表中的所有书籍,但是intellisense甚至没有给我books表上的MyUser_id属性
我真的不知道该怎么办。我所要做的就是为用户自动加载所有相关书籍,但我不知道如何做到这一点。有什么想法吗
谢谢您的图书类不包括外键参考的用户信息。尝试添加
[ForeignKey("UserId")]
public MyUser User { get; set; }
到图书类定义
当您使用查询获取用户时
_ctx.Users.Include(u=> u.Books)
应包括每个用户的书籍。将用户ID添加到图书类添加外键。我只是想知道在检索用户时是否有任何方法可以自动填充此集合?还是像您提到的那样,我总是必须手动填充?当您包含子实体时,它会自动加载。您可以将
书籍
列表标记为虚拟
,以便延迟加载。因此,无论何时访问它,框架都应该为您获取数据。另一个问题:如果我使用dbcontext检索用户,那么您的示例是有效的,但是如果我使用上面的代码中的UserManager类访问用户呢?如何从那里填充我的书籍?您可以使用该实体,直到其在上下文中。一旦它脱离上下文,您就无法访问导航属性来加载数据。因此,如果您的管理器是使用(var ctx=MyContext())实例化的{您可以在此处访问导航属性..}在此之后,根据EF的版本,您不能执行,您可能应该确保UserManager在完成上下文时正在处理上下文。我认为以后的版本不需要处理,尽管大多数示例仍然显示在using子句中使用上下文。