【问题标题】:Prefix tables with entity framework automatic code migrations带有实体框架自动代码迁移的表前缀
【发布时间】:2013-03-25 13:24:53
【问题描述】:

我开始了一个新项目 C#,并在包控制台窗口中使用了“enable-migrations”命令。这自然地为我的项目添加了迁移。然后我将自动迁移设置为 true,这样当我调用“update-database”时,它会为我创建包含所有键的表。

唯一的问题是我有多个网站想要这样做,它们都使用 ASP.NET 会员提供程序登录。通过自动代码迁移创建一堆帐户表供我使用。但是这些表都被称为相同的,所以如果我针对不同站点的相同数据库执行此操作,它们将相互覆盖。所以我得到的问题是:如何为实体框架创建的表指定前缀?

我在搜索时看到了一些关于如何执行此操作的想法,但它们对我不起作用(由于某种原因,必要的属性不存在等等。)

谢谢

异化

【问题讨论】:

  • 即使表的名称不同,如果您在多个应用程序之间共享同一个数据库,我认为迁移不会起作用,因为 EF 只创建一个 _MigrationHistory 表。

标签: c# entity-framework ef-code-first entity-framework-migrations


【解决方案1】:

我不确定你打算怎么做 - 如果我做对了,你会想保留one database (shared) in between number of web sites - 但是,让每个站点都有自己的成员表,名称不同,有不同的前缀,对吧?

第一个问题是for each Db/table name change - you need a 'code to match' - 即代码优先的实体和代码,Db 中的“迁移表” - 并且表都是同步的 - 所以它们可以按照应有的方式一起工作。从这个意义上说,只更改 Db 中的脚本或表名是行不通的It has to be done at the level of attributes (as @Steven suggested) or fluent configuration.

在您的情况下,这意味着您需要以某种方式为每个站点“构建”单独的配置,将它们单独(代码)部署到每个站点 - 并构建一个包含所有小 variantsmega Db每个合并在一起。

这将很难管理 - 但你可以尝试(我上面描述的) - 我不知道它是否有效(因为这需要很多“基础设施”来尝试这个) - 但也许沿着这些线...

  • 输入Table 属性(或通过流利的配置)
  • 构建代码 - 为每个“改变”表名称 - 并重新构建(理想情况下,您可能需要使用一些工具、代码生成器来批量自动执行此操作 - 即构建、外部复制文件、更改名称并重复)
  • 还为每个案例(表名)构建“迁移” - 保存迁移 作为文件 - 也可以使用Update-Database -Script 来保存实际的 每个案例的脚本(重要)。
  • 保存每个迁移 - 或者我们可以 说一个“脚本”来表示。
  • 一旦完成 - 你需要merge 迁移 - 脚本 - 到 one big master script - 即删除 相同的表集(当然只留下一个) - 并复制所有 成员表的不同集合。
  • 删除migration table 来自数据库 - 因为那肯定会不同步并且不会让你 做任何事情(或者我认为代码中还有一个标志可以忽略 那个,现在没有)。详情见下面我的其他 邮政。
  • 部署一个主数据库 - 使用您创建的脚本
  • 部署 特定代码 - 每个站点。
  • 祈祷一切顺利 :)

必须有一些更智能的东西 - 但另一方面,迁移不适用于此类场景,因此即使不是不可能,也很难实现这一目标。

一些可能有帮助的一般信息......

如何将迁移与现有数据库同步 - 面向生产场景,保持 Db-s 和 CF 匹配。这不完全是您所需要的,但有详细的描述,解决这个问题的可能方法,这是我前段时间写的......

MVC3 and Code First Migrations - "model backing the 'blah' context has changed since the database was created"

总结一下……

对我有用的是使用 Update-Database -Script

这会创建一个具有“迁移差异”的脚本,您可以 在目标服务器数据库上手动应用为 SQL 脚本(并且您 应该插入正确的迁移表行等)。

如果这仍然不起作用 - 你仍然可以做两件事......(更多内部)......

【讨论】:

  • 感谢您如此详尽的解释 :) 我同意您的观点。我的问题是(并且是)许多 webhotels(unoeuro、one.com 等)都为每个网站使用一个数据库。这意味着如果您在子域级别创建站点,则需要前缀来分隔该单个数据库中的表。我想我会改用网站的实体框架(没有自动代码迁移) - 再次感谢 :)
【解决方案2】:

我不知道如何让 Entity Framework 在所有实体中自动执行此操作。但是您可以强制使用表名或使用属性或流式 API 的模式来获得所需的效果。例如:

[Table("[put prefix here]_Users", Schema = "[put schema here]")]
public class User { 
    // ... 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多