Итак, я думаю, что это была небольшая ошибка 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. (Или, может быть, даже вызван).