2013-02-11 6 views
0

Как говорят на олове, можно создать экземпляр DbContext, пригодный для использования в качестве Entity Framework 5.0 POCO контекста, где Недвижимость Болгарии Недвижимости, которые, как правило, объявленная какEntity Framework 5.0 репозитория с динамическим DbContext

public DbSet<T> Entities { get; set; } 

не установлены/известны до запуска?

Я хотел бы сделать репозиторий, который имеет такие методы, как

public TEntity Find<TEntity>(object key) where TEntity : class 
{ 
    return _context.Set<TEntity>().Find(key); 
} 

public void Update<TEntity>(TEntity entity) where TEntity : class 
{ 
    if (_context.Entry(entity).State == EntityState.Detached) //entity is detached 
     _context.Set<TEntity>().Attach(entity); 
    _context.Entry(entity).State = EntityState.Modified; 
} 

.... etc 

, а затем использовать их, как:

Widget w = repository.Find<Widget>(123); 
repository.SaveChanges(); 

Это тривиально, если контекст репозитария установлен в класс, который содержит a DbSet<Widget> Widgets, но можно ли это сделать так, чтобы типы объектов, которые я планирую использовать, не будут известны до выполнения или, возможно, до тех пор, пока я их НЕ ИСПОЛЬЗУЮ их? Так что, если у меня есть новый класс Foo, я могу немедленно запросить мой репозиторий до .Find<Foo>(123) без предварительного добавления DbSet<Foo> Foos к моему классу DbContext?

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

ответ

2

Не нужно DbSet<Foo> Foos Недвижимость в вашем контексте. Это всего лишь один из способов рассказать о существовании объекта Foo. Есть несколько способов, как контекст обнаруживает преобразованные объекты:

  • явных DbSet<T> свойств
  • навигационных свойств в уже обнаруженных лицах
  • Указав отображение в DbModelBuilder
    • Переопределения OnModelCreated в вашем типе контекста
    • Создание DbModelBuilder вручную, его построение и составление в DbCompiledModel, которое может быть передано DbContext constructor
    • Объявляя EntityTypeConfiguration<T> для каждого объекта и добавляя его к DbModelBuilder (либо в OnModelCreated, либо вручную созданный DbModelBuilder).

Последний вариант может быть использован для обнаружения всех необходимых объектов при запуске приложения (например, путем поиска сборок для всех классов конфигурации сущностей и их регистрации модели строитель), но это все еще не полностью динамическое решение. Скомпилированная модель обычно создается только один раз для каждого приложения, когда контекст используется в первый раз. Без замены скомпилированной модели вы не можете добавлять или удалять сопоставленные типы объектов в контекст.

Смежные вопросы