EF 连接到 Azure-SQL

给出具体实例之前:先说说我们为什么选择Azure SQL:
Azure SQL 具有哪些优点了:

1.自主管理  省去了日常管理本地SQL Server实例的时间成本。

2.高可用性  如果一台硬件出故障,SQL Azure提供的自动执行故障转移可以确保应用程序的可用性。

3.可扩展性 横向扩展,分割了数据,服务随着数据增长而扩展,数据减少而收缩。

4.数据库版本 根据你实际情况,选择不同的版本。

实例代码:

using Autofac;
using Autofac.Integration.Mvc;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Infrastructure.DependencyResolution;
using System.Data.Entity.Infrastructure.Interception;
using System.Data.Entity.SqlServer;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using WebApplication3.Models;

namespace WebApplication3
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {

            var builder = new ContainerBuilder();
            builder.RegisterControllers(typeof(MvcApplication).Assembly);
            builder.Register<UserContext>((_) => new UserContext());
            builder.Register<IDbInterceptor>((_) => new MyNLogInterceptor());

            builder.Register<Func<IDbExecutionStrategy>>((_) => () => new SqlAzureExecutionStrategy());
            builder.Register<Func<TransactionHandler>>((_) => () => new CommitFailureHandler());

            var container = builder.Build();

            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            //添加一个依赖关系解析
            DbConfiguration.Loaded += (s, e) =>
                e.AddDependencyResolver(new MyAutofacDependencyResolver(container), overrideConfigFile: false);

            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }

    public class MyNLogInterceptor : IDbCommandInterceptor
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

        public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
        }

        public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
            LogCommandComplete(command, interceptionContext);
        }

        public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        {
        }

        public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        {
            LogCommandComplete(command, interceptionContext);
        }

        public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
        }

        public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
            LogCommandComplete(command, interceptionContext);
        }

        private void LogCommandComplete<TResult>(DbCommand command, DbCommandInterceptionContext<TResult> interceptionContext)
        {
            if (interceptionContext.Exception == null)
            {
                logger.Trace("Command completed with result {0}", interceptionContext.Result);
                logger.Trace(command.CommandText);
            }
            else
            {
                logger.WarnException("Command failed", interceptionContext.Exception);
                logger.Trace(command.CommandText);
            }
        }
    }

    public class MyAutofacDependencyResolver : IDbDependencyResolver
    {
        private ILifetimeScope container;

        public MyAutofacDependencyResolver(ILifetimeScope container)
        {
            this.container = container;
        }

        public object GetService(Type type, object key)
        {
            if (container.IsRegistered(type))
            {
                return container.Resolve(type);
            }

            return null;
        }

        public IEnumerable<object> GetServices(Type type, object key)
        {
            if (container.IsRegistered(type))
            {
                return new object[] { container.Resolve(type) };
            }

            return Enumerable.Empty<object>();
        }
    }
}

builder.Register<Func<IDbExecutionStrategy>>((_) => () => new SqlAzureExecutionStrategy());:使用SsqlAzure 执行策略
    builder.Register<Func<TransactionHandler>>((_) => () => new CommitFailureHandler());:注册一个事物处理程序

 具体详情:http://www.cnblogs.com/prinsun/p/ef_connection_retry.html

 使用指定的依赖关系解析程序接口,为依赖关系解析程序提供一个注册点,给MVC提供依赖关系解析。
 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

   

 添加一个依赖关系解析,为EF提供依赖关系解析
 DbConfiguration.Loaded += (s, e) =>
 e.AddDependencyResolver(new MyAutofacDependencyResolver(container), overrideConfigFile: false);
 MyNLogInterceptor:它可以侦听EF发送到数据库的命令
 private void LogCommandComplete<TResult>(DbCommand command, DbCommandInterceptionContext<TResult> interceptionContext)
        {
            if (interceptionContext.Exception == null)
            {                成功记录日志,命令和完成结果
                logger.Trace("Command completed with result {0}", interceptionContext.Result);
                logger.Trace(command.CommandText);
            }
            else
            {   失败记录日志,命令和异常
                logger.WarnException("Command failed", interceptionContext.Exception);
                logger.Trace(command.CommandText);
            }
        }


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebApplication3.Models;

namespace WebApplication3.Controllers
{
    public class HomeController : Controller
    {
        public UserContext Ucontext;
        public HomeController(UserContext context)
        {
            this.Ucontext = context;
        }
        // GET: Home
        public ActionResult Index()
        {
            User user = new User { Name = "2", Pwd = "21" };
            Ucontext.Users.Add(user);

            Ucontext.SaveChanges();

            return Content("Yes");
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                Ucontext.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

释放资源

 protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                Ucontext.Dispose();
            }
            base.Dispose(disposing);
        }

实现依赖解析 和  日志记录  还要引入两个包。

1.NLog 2.Autofac

引入Nlog包之后到开Nlog.config取消注释,运行程序之后点击显示所有文件将会出现一个Logs的文件,日志就在里面。

当我运行程序之后,成功创建了数据。


  日志文件

返回受影响行数一行,因为我只插入了一行吗。希望你能从中获益:)

EF 连接到 Azure-SQL,布布扣,bubuko.com

时间: 2024-11-22 19:35:36

EF 连接到 Azure-SQL的相关文章

Azure SQL Database (22) Azure SQL Database支持中文值

<Windows Azure Platform 系列文章目录> 在笔者之前的文章里,已经介绍了如何使Azure SQL Database支持中文: SQL Azure(七) 在SQL Azure Database中执行的T-SQL 其中的关键步骤是: 1.使用默认的字符集:SQL_LATIN1_GENERAL_CP1_CI_AS 2.显示中文的字段列,类型必须为NVARCHAR 3.插入中文字符时,在字符串前面加上一个大写字母N 但是在有些时候,把所有的T-SQL语句在字符串前面加上一个大写字

Java连接Azure SQL Database

Azure SQL Database是Azure上的数据库PAAS服务,让用户可以快速的创建和使用SQL数据库而不用担心底层的备份,安全,运维,恢复等繁琐的工作,本文简单介绍如何使用Java程序连接到SQL Azure数据库. 首先登录到你的Azure管理界面,选择创建新的SQL数据库,选择自定义创建: 输入数据库的名称,运维是第一次创建,所以选择新建SQL数据库服务器,对于不同的服务级别,请参照相关文档: 输入你的数据库登录名,密码,选择数据库区域,当然你的数据库应该和你的应用程序在一个于以获

使用SSMS 2014将本地数据库迁移到Azure SQL Database

使用SQL Server Management Studio 2014将本地数据库迁移到Azure SQL Database的过程比较简单,在SSMS2014中,有一个任务选项为“将数据库部署到Windows Azure SQL Database”: 使用本选项可实现一键迁移到Azure SQL Database. 但是, 最近由于近期Azure的改动,导致Azure支持的数据库类型与SSMS2014中数据库的类型不匹配,整个迁移过程会死在在Azue中创建数据库的步骤上.在国际版Azure, 已

SSMA迁移本地的MY SQL到本地SQL server及windows azure SQL Databaase

说到数据库,很多人都会想到MY Sql.SQL Server及oracle等等,同时很都人首选MY SQL,因为MY SQL是免费的,而且数据包也比较小,安装快捷方便,而SQL Server是收费的,是微软的产品,收费相当高,一般很少用,除非大数据,当然在资金满足的情况下会选择oracle数据库了,这些我就不具体说了,今天呢,我们主要介绍一下如何将本地的MY SQL数据迁移到SQL Serrver下,不管什么服务,迁移数据是最痛苦的事了,那有没有一种比较智能的方法做迁移呢,答案那是必须的,那是什

如何將 MySQL 資料庫轉移到 Microsoft SQL Server 與 Azure SQL Database

MySQL 是相當常用之資料庫伺服器,而微軟雲端服務 Microsoft Azure 上 Azure SQL Database 是一個功能強大且經濟實惠的選擇,透過本篇文章,使用 SQL Server Migration Assistant ( 以下簡稱 : SSMA ) 利用幾個簡單的步驟,可將您的 MySQL 資料庫移轉到  Microsoft SQL Server 或是 Azure SQL Database 上. SQL Server 移轉小幫手 SSMA 支援多種架構的資料庫 (Syba

Azure sql database 监控存储过程的传参情况

背景 实施开发的同事找到我,反馈说项目中使用Azure sql database 之后,无法使用Profiler来监控自己开发的存储过程的参数传参情况.确实profiler这些实例级别的工具在Azure sql database下是不支持的,那我们有没有办法,变相实现监控参数情况,特写一篇博客记录一下. 测试环境 Microsoft SQL Azure (RTM) - 12.0.2000.8 Mar 30 2017 01:30:03 Copyright (C) 2016 Microsoft Co

Azure SQL Database (1) 用户手册

<Windows Azure Platform 系列文章目录> 下载地址:Azure SQL Database用户手册

Global Azure SQL Server Database 导出和导入配置介绍

我们前一篇文章介绍了Global Azure SQL Server Database的备份和还原配置介绍,今天我们就说说Global Azure SQL Server Database的导出和导入功能介绍,其实说到导出和导入,我们大家都会想到,其实就是将数据导出成一种格式,然后在另外一个环境中导入即可,该功能有点类似备份和还原的功能,也可以理解为迁移的功能,但是按照官网的字段定义就是导出和导入,在Global Azure SQL Server Database的导出原理就是将数据库整个架构导出到

Global Azure SQL Server副本功能配置介绍

我们前面几篇文章介绍了Global Azure SQL Server Database的Backup.Recovery.Export.Import等相关功能 ,今天我们介绍一下Global Azure SQL Server Database的副本功能,其实说到副本两个字,言外之意就是备份,在Global Azure SQL Server Database的副本配置其实就跟Backup及Export.Import的工作原理一样,副本就是将正在运行的Global Azure SQL Server D