Entity Framework RC1 Проблема запроса DbContext - PullRequest
2 голосов
/ 17 марта 2011

Я пытаюсь реализовать шаблон репозитория, используя код структуры сущностей сначала rc 1. Проблема, с которой я сталкиваюсь, заключается в создании DbContext. У меня есть контейнер ioc, разрешающий IRepository, и у него есть contextprovider, который просто сообщает новый DbContext со строкой соединения в файле windsor.config. С linq2sql эта часть не была проблемой, но EF, кажется, задыхается. Я опишу проблему ниже на примере. Я вытащил код, чтобы немного упростить вещи, поэтому вы не видите здесь никаких шаблонов репозитория. просто сорта, что происходит без всего лишнего кода и классов.

            using (var context = new PlssContext())
            {
                var x = context.Set<User>();
                var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault();
            }

            using (var context2 = new DbContext(@"Data Source=.\SQLEXPRESS;Initial Catalog=PLSS.Models.PlssContext;Integrated Security=True;MultipleActiveResultSets=True"))
            {
                var x = context2.Set<User>();
                var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault();
            }

PlssContext - это место, где я создаю свой класс DbContext. Шаблон репозитория ничего не знает о PlssContext. Лучшее, что я мог сделать, - это создать DbContext со строкой подключения к базе данных sqlexpress и запросить данные таким образом. Строка подключения в var context2 была извлечена из контекста после обновления объекта PlssContext. Поэтому они указывают на одну и ту же базу данных sqlexpress.

Первый запрос работает. Второй запрос терпит неудачу с этой ошибкой:

Модель, поддерживающая 'DbContext' контекст изменился, так как база данных был создан. Либо вручную удалить / обновить базу данных или позвонить Database.SetInitializer с Экземпляр IDatabaseInitializer. За Например, DropCreateDatabaseIfModelChanges Стратегия автоматически удалит и воссоздать базу данных и, при необходимости, заполнить его новыми данными.

в этой строке

var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault();

Вот мой DbContext

namespace PLSS.Models
{
    public class PlssContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Corner> Corners { get; set; }
        public DbSet<Lookup_County> Lookup_County { get; set; }
        public DbSet<Lookup_Accuracy> Lookup_Accuracy { get; set; }
        public DbSet<Lookup_MonumentStatus> Lookup_MonumentStatus { get; set; }
        public DbSet<Lookup_CoordinateSystem> Lookup_CoordinateSystem { get; set; }

        public class Initializer : DropCreateDatabaseAlways<PlssContext>
        {
            protected override void Seed(PlssContext context)
            {

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

     modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

Тогда возвращается ошибка

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

Какой вид имеет смысл. Но как вы сводите все это вместе?

1 Ответ

4 голосов
/ 17 марта 2011

Это правильное поведение. Обычная DbContext не имеет представления о отображениях (= не знает ни одной из ваших сущностей). Вот почему вы всегда должны создавать производный контекст. Ваш репозиторий не знает о PlssContext, но вы все равно можете добавить его как:

public class Repository
{
  private readonly DbContext _context;

  public Repository(DbContext context)
  {
    _context = context;
  }
  ...
}

var repository = new Repository(new PlssContext());

Вы не можете использовать базовый DbContext экземпляр напрямую при первом использовании кода.

...