Как изменить метод Seed инициализатора базы данных при использовании шаблонов Repository и UnitOfWork в приложении MVC5 ASP. Net? - PullRequest
0 голосов
/ 09 января 2020

Я просматривал учебник https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

(На самом деле я использую MVC5, и даже сейчас он старый !!) Версия MVC5 того же учебника не была '1020 * много в хранилище и единицу работы).

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

У него есть метод

protected override void Seed( MyContext context )

Теперь мне кажется, что я должен изменить код, чтобы использовать UnitOfWork, а не MyContext

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

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

Так что вопрос в том, как только вы это сделали и реализовали Repository и UnitOfWork, как вы это исправите? initiali код zation, или как еще вы инициализируете свою базу данных начальными данными?

1 Ответ

0 голосов
/ 10 января 2020

Итак, я думаю, что это была небольшая ошибка n00b с моей стороны, и некоторые из вас, кто смотрел на это, вероятно, задавались вопросом, о чем я говорил, но я оставлю этот ответ здесь на всякий случай, если это поможет кто-нибудь еще.

Следуя уроку, я создал

public class GenericRepository<TEntity> where TEntity : class
{
    internal PayloadContext context;
    internal DbSet<TEntity> dbSet;

    public GenericRepository( PayloadContext context )
    {
        this.context = context;
        this.dbSet = context.Set<TEntity>();
    }

    ....
}

И я не очень внимательно посмотрел на эту вторую строку в конструкторе.

I Я видел, что контекст теперь создается в UnitOfWork и передается в различные репозитории, чтобы все репозитории могли делиться им.

Но я ошибочно думал, что то, что происходило выше, было DbSet создавался для этого хранилища. Поэтому я удалил объявление свойств DbSet из своего контекста, думая, что никогда не буду их использовать, и что теперь я буду получать доступ к данным через репозитории.

Другими словами, например, в контроллерах Я думал, что никогда не делал:

MyContext db = new MyContext();

и

public ActionResult Index()
{
    return View( db.MySetPropertyDeclaredInMyContext.Get() )
}

, а точнее

private UnitOfWork unitOfWork = new UnitOfWork();

и

public ActionResult Index()
{
    return View( unitOfWork .MySetPropertyDeclaredInMyUoW.Get() )
}

По Когда я вернулся к «исправлению» кода инициализации, я застрял, потому что в него был передан контекст, и на «старые» наборы сущностей были сделаны прямые ссылки. Кроме того, я сам не вызываю метод Seed из своего собственного кода.

Я понял, что вторая строка в конструкторе GenericRepository задала только ссылку на DBSet (это метод, а не 'новый'). Более того "Entity Framework требует, чтобы этот метод возвращал один и тот же экземпляр каждый раз, когда он вызывается для данного экземпляра контекста и типа сущности." Учитывая это, мне все еще нужны были мои оригинальные объявления свойств DbSet внутри context.

Метод DatabaseInitializer Seed может остаться неизменным.

Для полноты, для тех, кто интересуется, где это вызывается: Реализация этого интерфейса [IDatabaseInitializer] используется для инициализации нижележащего база данных, когда экземпляр производного класса DbContext используется в первый раз. Эта инициализация может условно создать базу данных и / или заполнить ее данными. Используемая стратегия устанавливается с использованием свойства stati c InitializationStrategy класса Database

Таким образом, другими словами, этот код инициализации был в порядке и будет запущен при первом использовании контекста, который будет первым время выполнения UnitOfWork. (Или, может быть, даже вызван).

...