簡體   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