использование того же dbContext для Identity и других объектов db

У меня есть приложение, которое использует модели EntityFramework edmx, и я хочу иметь возможность использовать один и тот же dbContext для моих классов Identity и классов сущностей. Кто-то поднял похожий запрос, но я не могу чтобы они были совместимы.

я изменил определение класса в классе контекста EF, как показано ниже

    public partial class MyDbContext : IdentityDbContext<AspNetUser>
    {
    }

и мой идентификационный пользователь как

public partial class AspNetUser : IdentityUser
{
}

но я получаю сообщение об ошибке, когда я пытаюсь войти или зарегистрироваться

Тип сущности AspNetUser не является частью модели для текущего контекста.


person Tim    schedule 15.11.2013    source источник
comment
вообще говоря, вы не хотите использовать один и тот же dbContext для своих моделей приложений и моделей удостоверений, причина в том, что вы не можете контролировать асинхронный характер коммитов, например, диспетчер пользователей из удостоверения может сохранять изменения в середине ваша бизнес-логика работает с одним и тем же контекстом, однако, если ваша модель также является кодом, вы должны иметь возможность объединить два   -  person Kris Ivanov    schedule 15.11.2013


Ответы (2)


Решение, которое я недавно придумал, заключается в использовании единого контекста как для данных идентификации ASP.NET, так и для ваших бизнес-объектов:

public class DatabaseContext : IdentityDbContext<UserInfo>
{
    public virtual DbSet<Comment> Comments { get; set; } // Your business entities

    public DatabaseContext()
    : base("name=DatabaseContext")
     {
     }
}

Обратите внимание, что DatabaseContext наследуется от IdentityDbContext.

При таком подходе есть некоторые компромиссы: например, ваш уровень доступа к данным должен ссылаться на Microsoft.AspNet.Identity.Core и Microsoft.AspNet.Identity.EntityFramework; однако наличие единого контекста базы данных в вашем проекте значительно упрощает работу, если вы используете внедрение зависимостей или миграцию Entity Framework.

person user1089766    schedule 07.11.2014

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

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

Кроме того, если вы когда-либо хотели, чтобы ваше приложение dbContext было чем-то другим, кроме кода, сначала будет невозможно объединиться с идентификатором dbContext.

person Kris Ivanov    schedule 15.11.2013
comment
Итак, какой метод вы бы использовали для перехода от текущего пользователя, вошедшего в систему, к другим связанным объектам в вашей модели EF. то есть, когда я userA щелкает ссылку для загрузки новой страницы, метод контроллера имеет свойство пользователя, которое показывает его пользователя, вошедшего в систему, я хочу иметь возможность сделать User.Orders.First().Id, например - person Tim; 15.11.2013
comment
в зависимости от того, как вы настроили свои отношения, вы должны пойти против своего репозитория модели приложения и загрузить заказы, используя идентификатор пользователя, что-то вроде dbContext.GetDbSet<Order>.Where(o => o.UserId == User.Identity.GetUserId()).Select(o => o.Id).First(), это просто зависит от вашей модели. - person Kris Ivanov; 15.11.2013
comment
Хотя большую часть времени мне нравится использовать Code First. Однако иногда мне проще перевернуть POCO таблицу с данными, чем писать начальный метод. - person stink; 16.11.2013