0

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

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

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

谢谢

异种

4

2 回答 2

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.

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

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

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

必须有一些更聪明的东西 - 但另一方面,迁移不适用于这种情况,因此即使不是不可能,也很难做到这一点。

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

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

MVC3 和 Code First 迁移 - “自从创建数据库以来,支持‘blah’上下文的模型已经改变”

总结...

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

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

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

于 2013-03-25T16:38:39.260 回答
0

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

[Table("[put prefix here]_Users", Schema = "[put schema here]")]
public class User { 
    // ... 
}
于 2013-03-25T13:35:38.547 回答