两个Azure移动服务(.NET后端)共享同一个数据库

时间:2014-05-30 19:33:55

标签: azure azure-sql-database azure-mobile-services

我有两个共享相同Azure数据库的Azure移动服务(.NET后端)。假设服务“X”和“Y”。数据库由服务“X”(当它第一次运行时)创建,并创建具有模式名称“X”的表“TA”。然后我运行了服务“Y”,它在同一个数据库中创建了相同的表“TA”和“TB”,但模式名称为“Y”。

现在我想让服务“Y”使用模式“X”来确保两个服务使用相同的数据。在“TADataController”中,我将代码更改为:

    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        // MyContext context = new MyContext(Services.Settings.Name.Replace('-', '_'));
        YContext context = new YContext("X");
        DomainManager = new EntityDomainManager<ADataController>(context, Request, Services);
    }

同样在“YContext”类

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
            //string schema = ServiceSettingsDictionary.GetSchemaName();
            //if (!string.IsNullOrEmpty(schema))
            //  modelBuilder.HasDefaultSchema(schema);
            modelBuilder.HasDefaultSchema("X");
    }

但是当我尝试使用Query()访问“TADataController”中的数据时,我得到一个带有消息的SqlException“指定的模式名称”X“要么不存在,要么您没有权限使用它”。我怀疑权限是否会成为问题,因为两个服务都使用相同的Azure数据库帐户,而且当我的其他服务使用它时,显然存在模式!所以我无法弄清问题是什么。

我也尝试过:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var entityConfig = modelBuilder.Entity<UserProfileData>();
        entityConfig.ToTable("UserProfileDatas", "X");
    }

但提出了同样的例外。 Web上有一些信息用于将数据传输到另一个模式,如果我想将数据传输到服务“Y”,这可能会有所帮助。但我想在共享数据库上使用“X”和“Y”服务。

更新: 我意识到OnModelCreating中使用的ServiceSettingsDictionary.GetSchemaName()会根据配置返回架构的名称,所以我上传了原始代码:

    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        MyContext context = new MyContext(Services.Settings.Name.Replace('-', '_'));
        DomainManager = new EntityDomainManager<ADataController>(context, Request, Services);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
            string schema = ServiceSettingsDictionary.GetSchemaName();
            if (!string.IsNullOrEmpty(schema))
                modelBuilder.HasDefaultSchema(schema);
    }

然后在管理门户中,我使用Key = MS_TableSchema和Value = X向Configuration \ App Settings添加了一个项目。然后再次调试代码,我意识到ServiceSettingsDictionary.GetSchemaName()按我的意愿返回“X”,但是控制器再次抛出一个SqlException,消息“指定的模式名称”X“要么不存在,要么你没有权限用它。”当我使用Query()方法。

2 个答案:

答案 0 :(得分:2)

我理解这一点 - 您希望您的两个服务在同一个数据库中访问同一组表吗?不只是使用相同的数据库,而是使用相同的表?

您可以轻松地重复使用相同的数据库,但我们将每个移动服务设置为使用单独的架构和权限,以便仅访问该架构,以便两个服务不会无意中发生干扰。

然而,听起来你希望他们访问相同的表,对吧?这意味着除了更改服务中的架构之外,还需要在DB中为移动用户设置权限以访问该架构。

您可以使用环境选项卡下的kudu站点获取用户(查找MS_TableConnectionString连接字符串):

https://<your service>.scm.azure-mobile.net/Env

您可以使用grant命令为该用户设置权限 - 您可以看到她的示例:

https://weblogs.asp.net/fredriknormen/database-migration-and-azure-mobile-service-adventure

希望这有帮助!

的Henrik

答案 1 :(得分:2)

当名为&#39; MSName&#39;的移动服务时创建了一个名为&#39; MSName&#39;的模式。在数据库中定义,并且创建的用户仅具有访问该模式的权限。这是默认连接字符串中的用户,移动服务在运行时连接到数据库时将使用该字符串。所以如果你有服务&#39; X&#39;并尝试从中访问该服务&#39; Y&#39;用户将无权使用该服务。

您可以采取一些方法来解决这个问题。一个是找到服务用户&#39; Y&#39; (使用其中一个SQL服务器管理工​​具)并授予其访问X&#39;的架构的权限。另一个选择是,当在移动服务Y中创建上下文时,不使用默认连接字符串(&#34; Name = MS_TableConnectionString&#34;),而是使用用户进行&#39; X&#39的连接字符串;