zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    POJ 3616 Milking Time(简单区间DP)
    AizuOJ ALDS1_7_A Rooted Trees(有根树的表达)
    jQuery中 attr() 和 prop() 的区别
    前后端交互模式
    快速排序
    冒泡排序实现
    Vue 组件间进行通信
    JavaScript 数组常用方法
    如何将内网映射到公网?
    javax.mail.AuthenticationFailedException: 535 Login Fail. Please enter your authorization code to login. More information in
  • 原文地址:https://www.cnblogs.com/nhsd/p/4503773.html
Copyright © 2011-2022 走看看