public static void ProvisionTenant(string tenantSchema, DbConnection connection)
{
using (var ctx = Create(tenantSchema, connection))
{
if (!ctx.Database.Exists())
{
ctx.Database.Create();
}
else
{
var createScript = ((IObjectContextAdapter)ctx).ObjectContext.CreateDatabaseScript();
ctx.Database.ExecuteSqlCommand(createScript);
}
}
}
上面的代码是我卡住的地方。 var createScript是行。CreateDatabaseScript尝试根据C#MVC中的迁移更新数据库
我试图让C#MVC中的多租户工作(与多个模式)。 这是将租户租用到数据库中的代码。
我有2个租户试图在我的初始化文件/代码中创建。
,该代码使得一些DDL脚本添加新的模式和表到模式等
所以正在取得脚本时,一次,只有一次,它已成功为的一个制作租户,然后在下一个租户它错误。
我在脚本执行之前看过一个脚本(那一个成功的时间),它有正确的DDL!所以这是一个好的开始。
当它不能工作的时候,它会随机进入我唯一的迁移(名为:update1)designer.cs文件,并不断循环遍历它的一部分,然后尝试使用THAT更新我的数据库移民! 当它这样做时,数据库显然会尝试添加表,其中之一就是__MigrationHistory表,所以它会引发一个问题,那就是该表已经存在。
为什么我的脚本不制作脚本,而是试图根据最新的迁移来更新数据库?
下面是对“UPDATE1”迁移designer.cs文件(我唯一的迁移)的代码:
// <auto-generated />
namespace CRMMVC.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class update1 : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(update1));
string IMigrationMetadata.Id
{
get { return "201510271010339_update1"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}
UPDATE: 所以我做了所谓的update2Empty另一个迁移,跑更新数据库。很明显,一个是空的。
这次CreateDatabaseScript()方法进入Configuration.cs检查AutomaticMigrationsEnabled是否为真,然后转到private1只读的ResourceManager Resources = new ...在update1的designer.cs文件中的行,然后开始循环通过update2Empty和update1的designer.cs文件的字符串ImigrationMetadata.Id,不断获得它们的每一个,然后切换到另一个。
然后最后回到update1的designer.cs,抓取IMigrationMetaData.Source然后通过ImigrationMetaData.Target,最后试图运行所有的update1!
这是疯了,任何想法?我希望描述有帮助...