0

正如它在锡上所说,是否可以创建一个适合用作实体框架 5.0 POCO 上下文的 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)而不必先将 a 添加DbSet<Foo> Foos到我的 DbContext 类中?

我认为这应该是可能的,因为 poco 类或持有对它们的引用的 DbContext 实例没有什么特别之处。

4

1 回答 1

2

你不需要DbSet<Foo> Foos财产。这只是讲述Foo实体存在的上下文的一种方式。上下文如何发现映射实体有多种方式:

  • 通过显式DbSet<T>属性
  • 通过已发现实体中的导航属性
  • 通过指定映射DbModelBuilder
    • 覆盖OnModelCreated在您的上下文类型中
    • 手动创建DbModelBuilder,构建和编译它DbCompiledModel可以传递给DbContext构造函数
    • 通过声明EntityTypeConfiguration<T>每个实体并将其添加到DbModelBuilder(在OnModelCreated或手动创建DbModelBuilder)。

最后一个选项可用于在应用程序启动时发现所有必需的实体(例如,通过搜索所有实体配置类的程序集并将它们注册到模型构建器),但它仍然不是完全动态的解决方案。当第一次使用上下文时,编译模型通常只在每个应用程序运行时构建一次。如果不替换已编译的模型,您将无法在上下文中添加或删除映射的实体类型。

于 2013-02-12T09:48:55.400 回答