2014-12-30 4 views
0

В настоящее время я пишу небольшое тестовое приложение, чтобы понять, как работает IdentityUser.Как загрузить связанные объекты с помощью IdentityUser и Entity Framework

Я создал класс MyUser, который наследуется от IdentityUser. Единственным дополнительным свойством в моем пользовательском классе является коллекция моего Книга.

Я создал методы на контроллере, которые успешно хранят новых пользователей в базе данных и связанных книгах. Проблема в том, что когда я пытаюсь загрузить пользователя, коллекция книг для этого пользователя не заполняется - она ​​всегда равна нулю.

Когда я проверяю базу данных, я вижу, что книга хранится в базе данных с соответствующим идентификатором пользователя, но я не могу найти эту коллекцию.

Вот то, что я до сих пор:

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

MyUser.cs:

public class MyUser : IdentityUser 
{ 
    public IList<Book> Books { get; set; } 
} 

MyAppContext.cs:

public class MyAppContext : IdentityDbContext<MyUser> 
{ 
    public MyAppContext() : base("MyApp") 
    { 

    } 

    public DbSet<Book> Books { get; set; } 
} 

AuthRepository:

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

я полагал, может быть, в рамках метода GetUser() Я мог бы вручную извлечь все книги из таблицы книги с _ctx.Books.Where (б => b.MyUser_id == user.Id), однако intellisense даже не дает мне свойство MyUser_Id в таблице Books.

Я не уверен, как это сделать. Все, что я хочу сделать, это загрузить все связанные книги для пользователя автоматически, но я не уверен, как это сделать. Есть идеи?

Благодаря

+1

Добавить UserId в ваш класс книги add Foreign key – Sefa

ответ

2

Ваш класс для книги не включает в себя информацию о пользователях внешнего ключа ссылки. Попробуйте добавить

[ForeignKey("UserId")] 
public MyUser User { get; set; } 

к определению класса книги.

Когда вы получаете пользователей с запросом

_ctx.Users.Include(u=> u.Books) 

должны быть включены книги для каждого пользователя.

+1

Спасибо Стив. Мне просто интересно, есть ли способ автоматически заполнить эту коллекцию, когда я получаю пользователя? Или мне всегда приходится вручную заполнять, как вы уже упоминали? – alimac83

+4

Когда вы включаете дочернюю сущность в ее загружаемую загрузку. вы можете пометить список 'Books' как' virtual' для ленивой загрузки. Поэтому всякий раз, когда вы обращаетесь к нему, структура должна получать данные для вас. – Nilesh

+1

Еще один вопрос: ваш пример работает, если я использую свой dbcontext для извлечения пользователей, но что, если я получаю доступ к пользователю с классом UserManager, как в моем коде выше? Как мне заполнить мои книги? – alimac83

Смежные вопросы