sunil mali Ответов: 1

Entity framework не может загружать роли от одного ко многим


Всем Привет,

Это первый раз, когда я создаю что-то на ASP.net MVC с entity framework с подходом code first, сведения о пользователе загружаются, но роль для пользователя не загружается мой код выглядит следующим образом.

Что я уже пробовал:

public class User
 {
     public int UserId { get; set; }
     [Required]
     public string UserName { get; set; }

     [Required]
     public string UserPwd { get; set; }
     public string ProjectCode { get; set; }
     public string UserType { get; set; }
     public bool IsEnabled{ get; set; }
     //public int RoleId { get; set; }

     public DateTime? CreatedDate { get; set; }
     public string CreatedBy { get; set; }
     public DateTime? UpdateDate { get; set; }
     public string UpdatedBy { get; set; }
     public Role Role { get; set; }

 }


public class Role
{
    public int RoleId { get; set; }
    public string RoleName { get; set; }

    public ICollection<User> Users { get; set; }
}


public class UserContext : DbContext
{
    public DbSet<Role> Roles { get; set; }
    public DbSet<User> Users { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<UserContext>(null);
        modelBuilder.Entity<User>().ToTable("Users");


        modelBuilder.Entity<User>().HasKey(u=> new{ u.UserId});

    }

}


public static bool Authenticate(User u)
{
    UserContext uc = new UserContext();

    List<User> uList = uc.Users.Where(p => p.UserName == u.UserName && p.UserPwd == u.UserPwd).ToList();


    return false;
}


Выше uList возвращает список пользователей, но не роли??
Не в состоянии понять, что делать, перепробовал много статей в интернете, но ничего действительно не работает для меня.

1 Ответов

Рейтинг:
7

Richard Deeming

Entity Framework Загрузка Связанных Сущностей[^]

У вас есть два варианта:

1) Ленивая Загрузка (Не рекомендуемый)
Создайте свою коллекцию и навигационные свойства virtual, и Entity Framework создаст динамические прокси-серверы для ваших сущностей, которые смогут динамически загружать связанные сущности по требованию.

public virtual Role Role { get; set; }

Однако это работает только до тех пор, пока DbContext он все еще жив, и это может резко увеличить количество используемых запросов.

2) Предвыборка
Используйте Include метод расширения для загрузки связанных сущностей одновременно с основной сущностью.
List<User> uList = uc.Users
    .Include(p => p.Role)
    .Where(p => p.UserName == u.UserName && p.UserPwd == u.UserPwd)
    .ToList();



NB: Вы храните пароли в виде обычного текста. Не делай этого!
Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

И почему вы заново изобретаете колесо? ASP.NET имеет несколько совершенно хороших встроенных систем аутентификации - например, Личность ASP.NET [^]


Karthik_Mahalingam

5

sunil mali

Благодарю вас сэр,
Ленивая загрузка отлично сработала в моем случае.
Я попробовал нетерпеливую загрузку, но она дала ошибку на линии .Включают(п =&ГТ; п.Роль) (Не удается преобразовать лямбда-выражение В тип string, поскольку оно не является типом делегата.)
Не могли бы вы мне помочь?

зачем вы заново изобретаете колесо? ASP.NET имеет несколько совершенно хороших встроенных систем аутентификации - например,
[Сунил]это всего лишь демонстрационный проект, который я хочу попробовать, прежде чем начать с реального проекта, чтобы не застрять, когда я работаю над реальной средой.

sunil mali

Я сделал ошибку, когда нетерпеливая загрузка была из-за пространства имен(System.Data.Entity)
Большое вам спасибо, Ричард, ваш ответ был очень полезен.
Кроме того, ссылки, предложенные вами, были очень полезны. Очень ценю, еще раз благодарю вас.