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

时间: 2024-10-27 05:04:17

EF5.0中的跨数据库操作的相关文章

在安卓开发中使用SQLite数据库操作实例

前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tc

Asp.Net MVC3.0中防止跨站的POST

在Form中添加 @Html.AntiForgeryToken(); 在后台的Action中增加 [ValidateAntiForgeryToken] 这个方法还可以添加自定义的参数 @Html.AntiForgeryToken("SaltValue"); 后台的Action中,必需指名Token的值才允许正常提交. [ValidateAntiForgeryToken Salt=("SaltValue")] Asp.Net MVC3.0中防止跨站的POST,布布扣,

Linux系统中安装MySQL数据库操作手册

Linux系统中MySQL数据库安装手册 一.安装概述: 在Linux操作系统中安装MySQL数据库是一个我们必须要掌握的一门技术,也决定了你以后找工作的薪资待遇,所以你知道它的厉害了吧!学会安装只是第一步,你还得学好数据库的基本操作,以及搭建一个数据库的主从配置等等.这些我都会在后面的博文中说到.下面我就简单的写一些安装MySQL数据库的一些步骤,仅供参考,如有什么不妥的地方,还请见谅! 二.安装步骤: (一)基本准备工作 1.打开虚拟机,在虚拟机中下载好最新版的MySQL数据库的压缩包.在M

解决项目中的跨域操作问题

浏览器存在许多安全策略,其中同源策略就是其中一个,所谓同源策略也叫同域名策略,即只有协议+域名+端口一致的情况下才可以相互访问,其目的就是为了保护用户信息的安全,同源策略现在的范围包括三方面:1).Cookie.LocalStorage.IndexDB无法读取:2).DOM无法获取:3).AJAX请求不能发送.这里主要介绍两种解决AJAX请求不能发送的解决方案:JSONP和CORS.JSONP是一种前端的解决方式:CORS是跨域资源共享,在服务端实现. 一.JSONP 这里使用jquery的$.

Sqlserver 实际开发中常见的数据库操作增删改查----删

--我们就以院系,班级,学生来举例. create TABLE [dbo].YuanXi ( Id int IDENTITY(1,1) NOT NULL,--学校id 自增量 YuanXiName varchar(50) null, --院系名字 ) create TABLE [dbo].Class ( Id int IDENTITY(1,1) NOT NULL,--班级id 自增量 YuanXiID int null,--院系id ClassName varchar(50) null --班级

python中的MySQL数据库操作 连接 插入 查询 更新 操作

MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维基百科对数据库表的简要解释,要想详细了解,需要看官在找一些有关数据库的教程和书籍来看看. 在关系数据库中,数据库表是一系列二维数组的集合,用来代表和储存数据对象之间的关系.它由纵向的列和横向的行组成,例如一个有关作者信息的名为 authors 的表中,每个列包含的是所有作者的某个特定类型的信息,比如

Sqlserver 实际开发中常见的数据库操作增删改查----增

注意我说的常见查询,可不是简单到一个表得增删改查,做过实际开发得人都知道,在实际开发中,真正牵扯到一个表得增删改查只能说占很小得一部分,大多都是好几个表的关联操作的. 下面我就说一下我在实际开发中经常用到得一些增删改查方式.(首先我还要说一下,就是我虽然能写,但是我不知道这种查询方式叫什么类型查询,毕竟数据库这块以前都没干过,做.net开发也就一年左右,大家看我写的博客也会知道,以前搞前端U3D游戏开发的,不接触数据库,取数据调后台接口就行了,其他不用管.所以没做.net前,我也就是会大学时候学

jdbc中对mysql数据库操作的简单封装--(仅做备忘记录)

本次使用jdbc中的mysql-connector-java-5.1.47-bin.jar的连接包,下载这个jar包放在javaee项目的WEB-INF/lib目录下,再把它作为外包jar包进入到libraries中,这样就可以使用mysql的jdbc接口了. 自己封装的代码中引入了两个自己字义的Exception:SqlSecureException.java package com.myproweb.exception; public class SqlSecureException ext

as3.0 中MovieClip的拖放操作

MovieClip继承了Sprite这个类,这个类中有两个public方法其分别是startDrag与stopDrag,而这两个方法可以让我们方便的去操作Sprite及其子类的实例的拖放. 下面展示在库中有个MovieClip 具体的拖放上面的MovieClip代码如下 import flash.events.MouseEvent; import flash.geom.Point; var dobj:DragObj = new DragObj(); dobj.addEventListener(M