初探ASP.NET Mvc5+EF7的美妙旅程
序
话说今年微软是很给力的,win10算是吸引了大众的眼球了,而最新的.net5框架更是ok。
最新的.net5进行了开源,同时利用nuget以及node和bower进行了跨平台化;这意味这可以直接在mac或者linux上使用.net进行开发。
而最新的m5和ef框架也算是进行了换脸了,跟之前mvc4的项目都不一样,如果进行移植除了核心代码可以拷贝过来,其他的统统要重新来过。
最近准备改版一下网站,所以尝试了一把最新的框架;当然由于现在还是预览版所以改动什么的都超大,所以也走了不少弯路;特在此记录一下。
项目准备
工具:vs2015/visual studio code 2015 下载地址
mvc5 vs 插件:最新的预览版为beta7 下载地址
由于是beta7,而微软官方的说明文档和例子大部分可以适用,但是有些地方也是不对的,比如ef的命令,ef beta3 与 beta7差别很大,这也就是预览版的缺点,时不时的就改动了。
另外我这里使用的是vs2015而非visual studio code ,毕竟有好点的肯定就用好的啊。
开工
新建项目
打开vs,点击文件-新建-项目-web
这里起名叫做:musicbank,就是一个音乐店吧。
在这里我们来一个空的就好。我们来自己建立model/ef….
ok,项目建立好了后,我们看见的是这样的。
可以看见我们的项目其实是在 src 文件夹下面。而项目中除了引用+简单设置以外就没有任何东西。
环境搭配
项目有了,但是却并不能直接用,我们需要搭建环境,比如我们需要引入ef等等。
dependencies
打开文件“project.json” 我们修改dependencies部分为:
dependencies: { microsoft.aspnet.server.iis: 1.0.0-beta7, microsoft.aspnet.server.weblistener: 1.0.0-beta7, microsoft.aspnet.staticfiles: 1.0.0-beta7, microsoft.aspnet.mvc: 6.0.0-beta7, entityframework.commands: 7.0.0-beta7, entityframework.sqlserver: 7.0.0-beta7, microsoft.framework.configuration.json: 1.0.0-beta7, microsoft.framework.configuration.usersecrets: 1.0.0-beta7 },
在这里添加了对mvc、ef、configuration的依赖。
mvc的作用主要用于控制器的解析等操作,包括了webapi。
ef当然就是了。
configuration 用来读取本地配置,方便设置。
commands
打开文件“project.json” 我们修改commands部分为:
commands: { web: microsoft.aspnet.hosting --config hosting.ini, ef: entityframework.commands },
commands模块的主要作用是命令行执行,可简化操作,比如实际执行时输入 “ef” 即可代表 “entityframework.commands”。
model
ok,在这里我们先建立文件夹 models,随后我们在model文件夹上右键-添加-类:
artist
using system; using system.collections.generic; using system.componentmodel.dataannotations; using system.componentmodel.dataannotations.schema; namespace musicbank.models { public class artist { [key] [databasegeneratedattribute(databasegeneratedoption.identity)] public guid id { get; set; } [required] public string name { get; set; } [required] public int age { get; set; } public virtual list
一个歌唱家,有个名字和年龄,然后有n个歌曲。
audio
using system; using system.componentmodel.dataannotations; using system.componentmodel.dataannotations.schema; namespace musicbank.models { public class audio { [key] [databasegeneratedattribute(databasegeneratedoption.identity)] public guid id { get; set; } [required] public string name { get; set; } [required] public int type { get; set; } [required] public string src { get; set; } [required] public guid artistid { get; set; } public artist artist { get; set; } } }
歌曲也简化了,一个名字,一个类型,一个源文件,属于某个歌唱家。
musiccontext
这个想必大家不陌生吧,用于数据库的查询等操作就全靠这个了;算是ef的精髓。
using microsoft.data.entity; namespace musicbank.models { public class musiccontext : dbcontext { public dbset
这里只需要添加两个表就ok。
sampledata
为了方便,这里我直接在创建数据库的时候就进行数据的初始化工作,添加一些默认数据。
using microsoft.framework.dependencyinjection; using system; using system.linq; namespace musicbank.models { public class sampledata { public static void initialize(iserviceprovider serviceprovider) { var context = serviceprovider.getservice(); if (context.database.ensurecreated()) { if (!context.artists.any()) { var austen = context.artists.add( new artist { name = austen, age = 21 }).entity; var dickens = context.artists.add( new artist { name = dickens, age = 25 }).entity; var cervantes = context.artists.add( new artist { name = cervantes, age = 27 }).entity; context.audio.addrange( new audio() { name = pride, type = 1, artist = austen, src = pride.mp3 }, new audio() { name = northanger, type = 2, artist = austen, src = northanger.mp3 }, new audio() { name = david, type = 3, artist = dickens, src = david.mp3 }, new audio() { name = donquixote, type = 1, artist = cervantes, src = donquixote.mp3 } ); context.savechanges(); } } } } }
首先这是一个静态方法,需要传入一个“iserviceprovider”,这个可以在项目启动的时候调用。
在方法进入后我们获取到上面的“musiccontext”,然后我们进行数据库创建与数据添加工作。
if (context.database.ensurecreated())
这句主要用于判断是否需要进行数据库创建,如果是将进行创建,同时返回true,而后我们判断是否具有数据,如果数据库表为空,那么我们添加一些默认数据。
配置文件 config.json
在项目根目录添加文件:“config.json”在其中配置数据库链接字段如下:
{ data: { musicconnection: { connectionstring: server=(localdb)\mssqllocaldb;database=musicbank-database;trusted_connection=true;multipleactiveresultsets=true } } }
启动配置 startup.cs
在项目启动的时候将会调用 startup.cs 中的相关方法进行数据的初始化操作。
在这里我们需要做三件事儿:
获取到配置config.json,在构造函数中完成 设置数据库文件连接,在configureservices方法中完成 初始化数据库相关数据,在configure方法中完成using microsoft.aspnet.builder; using microsoft.aspnet.hosting; using microsoft.data.entity; using microsoft.dnx.runtime; using microsoft.framework.configuration; using microsoft.framework.dependencyinjection; using musicbank.models; namespace musicbank { public class startup { public startup(ihostingenvironment env, iapplicationenvironment appenv) { var builder = new configurationbuilder(appenv.applicationbasepath) .addjsonfile(config.json) .addjsonfile($config.{env.environmentname}.json, optional: true); builder.addenvironmentvariables(); configuration = builder.build(); } public iconfigurationroot configuration { get; set; } public void configureservices(iservicecollection services) { services.addmvc(); services.addentityframework() .addsqlserver() .adddbcontext(options => { options.usesqlserver(configuration[data:musicconnection:connectionstring]); }); } public void configure(iapplicationbuilder app, ihostingenvironment env) { app.usestaticfiles(); app.usemvc(); sampledata.initialize(app.applicationservices); } } }
到这里我们的初始化操作基本完成了,现在来看看如何访问数据库数据了。
controllers
首先在根目录添加文件夹 controllers,右键-添加-新建项
在这里我就使用一个简单的webapi来进行数据演示了,后面会在文章中详细写写数据的渲染相关。
在文件 audiocontroller.cs 中,我们更改代码为:
using microsoft.aspnet.mvc; using musicbank.models; using system.collections.generic; using system.linq; namespace musicbank.controllers { [route(api/[controller])] public class audiocontroller : controller { [fromservices] public musiccontext db { get; set; } [httpget] public ienumerable
一个属性,两个方法。
在这里我们可以看见 musiccontext 属性并没有初始化,但是下面却能直接调用;这是因为我们添加了一个属性“[fromservices]”,该属性意味着服务器能自动采用注解的方式对 db 进行赋值。
下面两个方法分别返回全部的音乐列表,和根据音乐名称返回音乐相关信息。
当然在两个方法上都有“[httpget]”属性,该属性指定了请求类型为 get 方式,当然也有其他几种,如:“httppost”“httpput”“httpdelete”等。
运行
在这里运行方式有两种,分别是 iis 与 web 命令行的方式。
iis
这种方式直接运行,vs将打开并设置端口。
web
还记得上面写到命令行的地方么?其中有这样一行:
web: microsoft.aspnet.hosting --config hosting.ini,
在这里我们启动时候的参数在“hosting.ini”文件中,我们打开 hosting.ini 文件。
server=microsoft.aspnet.server.weblistener server.urls=https://localhost:5000
可以找到我们访问的url,运行后把url拷贝到浏览器运行就ok。
运行情况下你会看见这样的窗口,可以看出其实是调用的dnx进行运行的程序。而 dnx 是可以跨平台的,这也就意味着可以直接在mac上跑起来。
效果
可以看出两个方法的接口调用结果是ok的。