【问题标题】:Entity Framework 5.0 Repository with dynamic DbContext具有动态 DbContext 的实体框架 5.0 存储库
【发布时间】:2013-02-12 17:48:55
【问题描述】:

正如它在锡上所说,是否可以创建一个适合用作实体框架 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();

如果存储库的上下文设置为包含DbSet&lt;Widget&gt; Widgets 的类,这很简单,但是可以这样做,以便我计划使用的实体类型直到运行时才知道,或者可能直到我真正知道使用它们?这样,如果我有一个新类 Foo,我可以立即将我的存储库查询到 .Find&lt;Foo&gt;(123),而不必先将 DbSet&lt;Foo&gt; Foos 添加到我的 DbContext 类中?

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

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    您的上下文中不需要 DbSet&lt;Foo&gt; Foos 属性。这只是告诉上下文有关Foo 实体存在的一种方式。上下文发现映射实体的方式有多种:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 2013-03-02
      • 1970-01-01
      • 2021-07-10
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      相关资源
      最近更新 更多