繁体   English   中英

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

[英]Two Azure Mobile Services (.NET backend) sharing the same Database

我有两个共享相同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()方法时。

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

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

但是,听起来你希望他们访问相同的表,对吧? 这意味着除了更改服务中的架构之外,还需要为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

希望这可以帮助!

亨里克

创建名为“MSName”的移动服务时,将在数据库中定义名为“MSName”的模式,并创建仅具有访问该模式的权限的用户。 这是默认连接字符串中的用户,移动服务在运行时连接到数据库时将使用该字符串。 因此,如果您有服务'X'并尝试使用它来访问服务'Y',那么它所使用的用户将无权这样做。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM