ASP.NET 5探险(1):Azure中配置连接字符串、独立项目执行EF7数据迁移

(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)

题记:我开始把ASP.NET 5用于生产系统开发已经有1个多月了,也填了一些坑积累了一些经验,从今天开始会陆陆续续分享给大家。

众所周知,虽然Visual Studio 2015已经进入RC了,ASP.NET 5整体上还处于beta4,所以不可避免会有很多坑。也由于ASP.NET 5的文档还不完善,所以我觉得有必要把自己的一些近一个月来使用ASP.NET 5开发产品的教训、经验或小技巧分享给大家。今天先分析两个话题。

一、在Azure的Web App(aka WebSite)中如何配置连接字符串

在之前的ASP.NET中,连接字符串是放到web.config中的ConnectionStrings下,如果Web应用部署到Azure Web App后,在Web App的配置中,填入名称相同的真实(正式)的连接字符串,在运行的时候会自动覆盖(替换)web.config中的值。

在ASP.NET 5同样也可以如法炮制,只是细节有所不同。由于在ASP.NET 5里,引入了新的配置基础结构,比如连接字符串一般配置到config.json文件的“Data:XXX:ConnectionString”,”XXX”是连接字符串的名称。所以在Azure的配置中,也只需要填写同名“XXX”的连接字符串即可。唯一遵循的约定就是连接字符串必须放到“Data:XXX:ConnectionString”中。

二、如何在独立的Class Library项目中执行Entity Framework 7的数据迁移

之前的文章介绍过如何执行Entity Framework 7的数据迁移,但是假如数据模型的类和DbContext在独立的Class Library项目中又要如何处理呢。或者说,你在独立的项目(非Web主项目,其一般包含config.json和Startup.cs)中执行“dnx . ef migration”相关命令的时候,报一个“DbContext no data storee configured”的错误,要怎么办?

其实,也很简单,只是稍微多做一步。当然首先在独立的项目中要完成基本的EF7数据迁移配置(见之前的文章)。然后,在独立的项目中也添加一个config.json文件,仅仅包含DbContext所用的“Data:XXX:ConnectionString”配置,这里的连接字符串的内容最好和主Web项目一致。再添加一个Startup.cs文件,里面仅仅包含加载配置信息和配置实体框架的代码。如下所示:

 public class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
            var configuration = new Configuration()
             .AddJsonFile("config.json");

            Configuration = configuration;
        }

        public IConfiguration Configuration { get; private set; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework()
               .AddSqlServer()
               .AddDbContext<CoreDbContext>(options =>
                   options.UseSqlServer(Configuration["Data:core:ConnectionString"]));
        }
    }

需要这样做的原因在于,project.json中的“ef”命令依然会完整启动整个应用程序(Class Library项目作为启动项)。这一点和EF6之前的版本有着很大不同。

【更新:2015-07-04】

上面的源代码有些错误,应该是下面的(使用ASP.NET 5 beta5):

using Microsoft.AspNet.Hosting;
using Microsoft.Data.Entity;
using Microsoft.Framework.Configuration;
using Microsoft.Framework.DependencyInjection;

namespace EIPCore.Models
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
            var builder = new ConfigurationBuilder()
             .AddJsonFile("config.json");

            Configuration = builder.Build();
        }

        public static IConfiguration Configuration { get; private set; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework()
               .AddSqlServer()
               .AddDbContext<CoreDbContext>(options =>
                   options.UseSqlServer(Configuration["Data:core:ConnectionString"]));
        }
    }
}

 

posted @ 2015-06-22 22:55  朱永光  阅读(1407)  评论(1编辑  收藏  举报