Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用IdentityUser和实体框架加载链接实体_C#_.net - Fatal编程技术网

C# 如何使用IdentityUser和实体框架加载链接实体

C# 如何使用IdentityUser和实体框架加载链接实体,c#,.net,C#,.net,我目前正在编写一个小型测试应用程序,以了解IdentityUser是如何工作的 我创建了一个从IdentityUser继承的MyUser类。自定义用户类上唯一的附加属性是我的书籍类的集合 我在控制器上创建了一些方法,成功地将新用户存储到数据库和相关书籍中。问题是,当我试图检索一个用户时,该用户的图书集合没有填充-它总是空的 当我检查数据库时,我可以看到数据库中存储了一本带有相关用户ID的书,但是我似乎无法检索此集合 以下是我到目前为止的情况: Book.cs: public class Book

我目前正在编写一个小型测试应用程序,以了解IdentityUser是如何工作的

我创建了一个从IdentityUser继承的MyUser类。自定义用户类上唯一的附加属性是我的书籍类的集合

我在控制器上创建了一些方法,成功地将新用户存储到数据库和相关书籍中。问题是,当我试图检索一个用户时,该用户的图书集合没有填充-它总是空的

当我检查数据库时,我可以看到数据库中存储了一本带有相关用户ID的书,但是我似乎无法检索此集合

以下是我到目前为止的情况:

Book.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.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子句中使用上下文。