以前在用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 = "",
age =
};
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 == );
role.id=;//作异常
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 = "",
age =
};
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 == );
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

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

  1. SQLSERVER跨数据库操作 ---- sp_addlinkedserver

    由于项目需要跨数据库进行相应的sql操作(这里遇到的是sqlserver的A库,到sqlserver的B库) sp_addlinkedserver [ @server = ] ' server ' [ ...

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

    前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLi ...

  3. laxcus的新功能:支持表跨数据库操作

    关系数据库的层次结构,是账号.数据库.表,一个账号下可以有多个数据库,每个数据库有多个表,但是不同数据库下的表是不能够互相操作的.例如:"select a.*, b.* from Title ...

  4. mysql跨数据库操作问题

    跨数据库的操作,如果是命名符合mysql规范的直接database.table,如果不符合规范比如加了 -  等符号需要在数据库上面加`database`.table(不是'database'.tab ...

  5. 3、PHP中常用的数据库操作函数解析

    mysql_connect  连接数据库 mysql_select_db 选择需要操作的数据库 mysql_query 执行数据库操作语句 mysql_fetch_array 以数组的形式返回每行查询 ...

  6. SpringBoot中使用spring-data-jpa 数据库操作(上)

    Java客户端使用Spring-Data-Jpa这个组件. Spring-Data-Jpa就是Spring对Hibernate的一个整合. 选择create在运行的时候它会自动帮我们创建一个表. sp ...

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

    MySQL数据库 就数据库而言,连接之后就要对其操作.但是,目前那个名字叫做qiwsirtest的数据仅仅是空架子,没有什么可操作的,要操作它,就必须在里面建立“表”,什么是数据库的表呢?下面摘抄自维 ...

  8. ADO.NET中SqlCommand对数据库操作

    我们要不断地进行数据库的读写,那么ExecuteNonQuery(),ExecuteReader()与ExecuteScalar()就是我们在对数据库进行操作时要用到的,下面我来依次认识一下:     ...

  9. python3中的mysql数据库操作

    软硬件环境 OS X EI Capitan Python 3.5.1 mysql 5.6 前言 在开发中经常涉及到数据库的使用,而python对于数据库也有多种解决方法.本文以python3中的mys ...

随机推荐

  1. POJ 2262 Goldbach's Conjecture (打表)

    题目链接: https://cn.vjudge.net/problem/POJ-2262 题目描述: In 1742, Christian Goldbach, a German amateur mat ...

  2. 在ASP.NET MVC中使用Grid.mvc

    很久没有写ASP.NET的博文了,专心工作嘛,今天写一点MVC的博文,也是自己练习来的,是使用grid.mvc来显示数据. 首先打开Manage Nuget Packages,搜索grid.mvc并安 ...

  3. JavaScript学习总结(五)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  4. (微信小程序)一 : 初识微信小程序

    首先看过angularjs的同学们在看微信小程序的创始文件应该不算很陌生吧. 需要看的 先是文件目录 看完这个目录..得知 ( 一 )    pages   他存放于多个页面 如 index ,log ...

  5. mahout 使用

    最近在做mahout源码调用的时候,发现一个参数:startPhase和endPhase,这两个参数是什么意思呢?比如运行RecommenderJob时,可以看到10个MR任务,所以猜测是否是一个ph ...

  6. Tomcat Connector原理

    Tomcat工作原理 要了解其中的工作原理我们首先看如下两个图 Tomcat基本架构图: Tomcat请求示意图: 客户端的请求通过Connector接受处理后在到容器Engine->Host- ...

  7. java多线程——线程池源码分析(一)

    本文首发于cdream的个人博客,点击获得更好的阅读体验! 欢迎转载,转载请注明出处. 通常应用多线程技术时,我们并不会直接创建一个线程,因为系统启动一个新线程的成本是比较高的,涉及与操作系统的交互, ...

  8. Hibernate中的事务隔离问题(脏读、不可重复读、幻读)

    Hibernate中的事务隔离问题(脏读.不可重复读.幻读) 1.事务的特性 事务的四个特性: 1)原子性:事务是进行数据库操作的最小单位,所以组成事务的各种操作是不可分割的 2)一致性:组成事务的各 ...

  9. python内置函数每日一学 -- any()

    any(iterable) 官方文档解释: Return True if any element of the iterable is true. If the iterable is empty, ...

  10. 5月7日——采用第三方页面内容,但是顶部title使用自己的

          --------->       由A页面进入我的页面 代码如下: (1)A页面下需要添加的代码 (2)我的页面下需要添加的代码 此处用到的语法为mui框架中的语法,可参照mui官方 ...