EF5.0中的跨數據庫操作


  以前在用MVC + EF 的項目中,都是一個數據庫,一個DbContext,因此一直沒有考慮過在MVC+EF的環境下對於多個數據庫的操作問題。等到要使用時,才發現這個問題也不小(關鍵是有個坑)。直接說這個問題的解決流程吧:

1)由以往的經驗:在ADO.NET中,要操作多個數據庫,那就多寫兩個SqlHelper吧,或封裝下,能動態的修改鏈接字符串。因此想到在這里能不能建多個ADO.NET實體數據模型呢?於是乎就有了這樣兩個文件:SealDBModel.edmx及UcmsDBModel.edmx。

2)SealDBModel是主要的,因此在Server中對其處理,作了繼承。也同時使用了UcmsDBModel。為了做測試,使用了以下代碼:

namespace Seal_Services
{
    public class seal_testServer : BaseServer<seal_test>, Iseal_usersServer
    {
        public void TTTT()
        {
                try
                {
                    seal_test test = new seal_test()
                    {
                        name = "1111",
                        age = 1
                    };
                    base.AddEntity(test);
                    base.db.SaveChanges();
                    BaseUCMSServer<au_Role> ucmsserver = new BaseUCMSServer<au_Role>();
                    au_Role role = new au_Role();
                    role = ucmsserver.FindEntitie(c => c.id == 7);
                    role.id=10;//作異常
                    role.role_name = "BBBBBBBBBBB";
                    ucmsserver.UpdateEntity(role);
                    ucmsserver.db.SaveChangesForUCMS();
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
        }
    }
}    

3)這段代碼是有問題的,當要同時操作不同數據庫,且有數據有效性的時候,就會發現前面的一個成功了,后面的一個失敗了。怎么辦呢?EF的事務機制顯然已經滿足不了程序的要求了,怎么辦呢?加TransactionScope吧。

4)於是乎就有了這樣一段代碼:

namespace Seal_Services
{
    public class seal_testServer : BaseServer<seal_test>, Iseal_usersServer
    {
        public void TTTT()
        {
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    seal_test test = new seal_test()
                    {
                        name = "1111",
                        age = 1
                    };
                    base.AddEntity(test);
                    base.db.SaveChanges();
                    BaseUCMSServer<au_Role> ucmsserver = new BaseUCMSServer<au_Role>();
                    au_Role role = new au_Role();
                    role = ucmsserver.FindEntitie(c => c.id == 7);
                    role.role_name = "BBBBBBBBBBB";
                    ucmsserver.UpdateEntity(role);
                    ucmsserver.db.SaveChangesForUCMS();

                    scope.Complete();
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
            }
        }
    }
}

5)可還是有問題呀,在處理第二個Server時會拋出異常“ 基礎提供程序在 Open 上失敗 ”。然而可以肯定的是,數據庫鏈接字符串是正確的。可卻報錯了,這是為什么呢?【這是我電腦環境上的一個坑】

6)經過分析(翻了無數百度相同的轉貼后...),想到了,會不會有SQL配置相關?導致了TransactionScope的使用失敗?

7)打開 Sql Server Configuration Manager時,我看到SQL Server服務,顯示的是:遠程過程調用失敗。這個???既然失敗,那就讓它正確。於是:打開 控制面板-卸載 找到 Express LocalDB。堅定的將其【卸載】。返回程序中,再執行。結果是......成功啦!!!

 

后記

  1)在EF中使用跨數據庫操作,可以考慮使用這里提供的[ 建立多個ADO.NET實體數據模型 ]的思路。在做TransactionScope事務時,一定要注意[ Express LocalDB ]。

  2)在解決EF跨數據庫操作的過程中,還考慮了[ SQL同義詞 ]的。但事實證明,這是完全行不通的做法,無論是在EF5.0,還是EF6.0中。

問題環境:Win8.1, Sql Server 2008 R2, Visual Studio 2013 Professional 2013 Update3

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM