Как исправить «Указанный член типа UserId не поддерживается в LINQ to Entities» в ApplicationUserManager - PullRequest
0 голосов
/ 17 июня 2020

В настоящее время я работаю над более старым веб-сайтом MVC 5, который изначально использовал базу данных, созданную первым кодом, с Entity Framework. С тех пор он был преобразован в db-first, подвергся рефакторингу, и сейчас я удаляю старые файлы сущности c# и заменяю их структурой сущностей ADO. net.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что при входе в систему я нажимаю следующую строку в ApplicationUserManager (которая происходит от UserManager (TUser, TKey)):

var user = await UserManager.FindByEmailAsync(model.Email);

И я получаю следующую ошибку: « Указанный член типа 'UserId' не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, элементы сущности и свойства навигации сущности. "

Наша сущность ApplicationUser, которая отражает таблицу db, использует переменную «Id» вместо «UserId». Я переопределил рассматриваемый метод, и он сработал, но я не хочу делать это всякий раз, когда нам нужно использовать UserManager. Итак, я думаю, я запутался, требует ли UserManager, чтобы переменная называлась UserId? Если нет, как я могу сказать ему, что он использует «Id»?

Не думаю, что я что-то упускаю (например, случайно добавляю UserId где-нибудь в операторе LINQ).

1 Ответ

0 голосов
/ 18 июня 2020

Это то, что я делаю, и пока вроде работает. В методе Create ApplicationUserManager вместо

var manager = new ApplicationUserManager(new UserStore<ApplicationUser, ApplicationUserRole, int, ApplicationLogin, ApplicationRole, ApplicationClaim>(context.Get<AppDbContext>()));

я создал CustomUserStore, производный от нескольких интерфейсов идентификации:

var manager = new ApplicationUserManager(new CustomUserStore(context.Get<AppDbContext>()));

Он начинается так:

    public class CustomUserStore : IUserStore<ApplicationUser, int>,
    IUserEmailStore<ApplicationUser, int>,
    IUserRoleStore<ApplicationUser, int>,
    IUserPasswordStore<ApplicationUser, int>,
    IQueryableUserStore<ApplicationUser, int>,
    IUserLockoutStore<ApplicationUser, int>,
    IUserLoginStore<ApplicationUser, int>,
    IDisposable
{
    public IQueryable<ApplicationUser> Users => ctx.ApplicationUsers;

    private AppDbContext ctx { get; set; }

    public CustomUserStore(AppDbContext _ctx)
    {
        ctx = _ctx;
    }

Затем я отменяю все необходимые методы. Это не то, что я хотел изначально, но пока подойдет.

...