2

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

  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 и запросить данные таким образом. Строка соединения в контексте var2 была схвачена из контекста после создания объекта PlssContext. Таким образом, они указывают на ту же базу данных sqlexpress.

Первый запрос работает. Второй запрос с треском проваливается с этой ошибкой:

The model backing the 'DbContext' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.

на этой линии

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) 
      { 

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

 modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 

Затем возвращается ошибка является

The entity type User is not part of the model for the current context.

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

ответ

4

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

public class Repository 
{ 
    private readonly DbContext _context; 

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

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

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

+0

будет использовать строку подключения, если я не использовал первый подход кода? После создания базы данных я все равно не смогу использовать DbContext со строкой подключения, чтобы делать то, что я хочу? – Steve

+0

Это не о строке подключения. Речь идет о конфигурации контекста, и конфигурация определяется производным классом, а не базовым классом. Вы должны использовать 'PlssContext'. –

+0

Мне нужно будет изучить способ передачи контекста с помощью windsor. Я думаю, я могу просто добавить его в качестве компонента. Мне не нравится, как вы его жестко закодировали в своем примере. – Steve