2015-10-27 89 views
0
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!

这是疯了,任何想法?我希望描述有帮助...

回答

0
private CRMContext(DbConnection connection, DbCompiledModel model) 
    : base(connection, model, contextOwnsConnection: false) 
{ 
    Database.SetInitializer<CRMContext>(null); 
} 

只需将该行(仅有的一行)添加到租户代码使用的构造函数即可。

我需要告诉数据库每次使用连接字符串的构造函数时不要使用初始化器。为什么?我不知道,但它停止了多个循环。

就是这样。字面上它。