【问题标题】:EF5 CodeFirst schema nameEF5 CodeFirst 模式名称
【发布时间】:2013-02-15 17:54:46
【问题描述】:

我正在开发这个应用程序,我必须从多个模式(在运行时定义)中的多个表(都具有相同的结构)中读取数据。 使用实体框架 5 和代码优先方法,我需要一种方法来更改实体的模式名称。 目前我正在使用带有两个参数的构造函数创建我的 DbContext,一个 DbConnection 和模式名称(我在覆盖的 OnModelCreating 中使用的女巫)。

我第一次创建 DbContext 时一切正常,我能够获取数据。但是当我使用第二个模式名称创建一个新的 DbContext 时,DbContext 使用的 DbConnection 是在构造函数中传递的一个,但实体中的模式名称仍然是第一个,因为即使我正在创建 OnModelCreating 也不会被调用DbContext 的新实例。

有什么想法吗? 谢谢

编辑:不要认为这很重要,但我使用的是 Oracle 数据库。

【问题讨论】:

  • 为什么不创建 2 个单独的 DBContext 或将两个模式放在同一个文件中?
  • 要连接的架构是在运行时定义的。

标签: entity-framework entity-framework-5


【解决方案1】:

您可以通过为每个架构(使用默认架构集)和多个连接字符串创建一个 SQL Server 用户来做到这一点。

在您的应用程序中,为每个用户创建一个连接字符串(模式)。添加一个接受连接字符串的 dbcontext 构造函数,然后将适当的连接字符串传递给构造函数。

【讨论】:

  • 这实际上是我所拥有的 :) 问题是我必须在实体的映射中提供模式名称,否则假设 dbo 时提供 EF。作为架构。
  • 哎呀对不起。误读了问题。看看你现在的意思。我不知道答案。
  • 你看到了吗 - romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first - 我只扫描了它,但它似乎可以满足你的要求。
【解决方案2】:

您可以通过提供自定义数据库初始化程序(IDatabaseInitializer 和 Database.SetInitializer(new YouCustomInitializer());) 来做一些事情

【讨论】:

  • 据我所知,IDatabaseInitializer 用于创建数据库,对吧?我正在使用现有数据库
  • 我相信每次初始化上下文时都会调用 IDatabaseInitializer。此时您也许可以做一些工作来重新创建不同的模式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
相关资源
最近更新 更多