话说今年微软是很给力的,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的。