2013-03-25 90 views
0

我启动了一个新项目C#,并在包控制台窗口中使用了“enable-migrations”命令。这自然增加了迁移到我的项目。然后,我将自动迁移设置为true,以便我称之为“update-database”,它将为我创建所有密钥和表格。带有实体框架自动代码迁移的前缀表

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

我已经看到了如何做到这一点的同时寻找一些想法,但他们并没有为我工作(必要的属性是不存在由于某种原因等等。)

谢谢

Xenoxsis

+0

即使表被命名不同,我不认为会迁移工作,如果您在多个应用程序之间共享相同的数据库,因为EF仅创建一个“_MigrationHistory”表。 – jrummell 2013-03-25 13:41:15

回答

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属性(或通过流利配置)
  • 构建代码 - “改变”的表名称为每个 - 和重建(理想情况下,你可能需要使用一些工具,代码生成器在批处理中自动执行此操作 - 即,您构建,复制外部文件,更改名称并重复)
  • 为每种情况构建“迁移”(Ta ble name) - 将迁移 保存为文件 - 也可以使用Update-Database -Script保存每个案例(重要)的实际 脚本。
  • 保存每次迁移 - 或者我们可以用 表示一个“脚本”来表示。
  • 一旦这样做 - 你需要merge的 迁移 - 脚本 - 为one big master script - 即除去 相同的一套表格(离开只是过程之一) - 复制所有 不同组的成员资格表。
  • 从数据库中删除migration table - 为想肯定是不同步的,不会让你 做任何事情(或者还有一个标志代码,我觉得只是忽略 的是,没有它现在)。有关详细信息,请参阅下面我的其他 帖子。
  • 部署一个主Db - 使用您创建的脚本
  • 部署 特定代码 - 到每个站点。
  • 祈祷它会所有的工作 :)

一定有什么东西更聪明 - 但另一方面,迁移不作出这样的情况下工作,所以这将是很难甚至是不可能的把这个关掉。

一些一般性的信息,可以帮助...

如何与现有数据库迁移同步 - 对生产方案面向,保持DB-S和CF相匹配。这不正是你需要的,但有一个详细的说明,要解决这里面我写了前一阵子可能的方式...

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

总结...

什么对我的作品是使用更新的数据库的-Script

这与“移民区别”,你可以 手动应用为目标服务器数据库的SQL脚本(创建一个脚本,您应该 得到正确的迁移TABL插入的行等)。

如果仍然不行 - 你仍然可以做两件事情...(更多内)...

+0

谢谢你那非常详细的解释:)我明白你的观点。我的问题是(和是),许多webhotels(unoeuro,one.com等)都为每个网站使用一个数据库。这意味着如果您要在子域级别上创建网站,则需要前缀来分隔单个数据库中的表。我想我会切换到只使用实体框架(没有自动代码迁移)的网站 - 再次感谢:) – 2013-03-26 08:02:50

+0

np,不客气:) – NSGaga 2013-03-26 11:13:33

0

无论如何,我不知道如何使Entity Framework在所有实体之间自动执行此操作。但是你可以使用属性或流利的API来强制一个表名或模式来获得所需的效果。例如:

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