当前位置: 移动技术网 > IT编程>开发语言>.net > 初识ASP.NET Mvc5+EF7的奇妙之旅

初识ASP.NET Mvc5+EF7的奇妙之旅

2017年12月12日  | 移动技术网IT编程  | 我要评论
话说今年微软是很给力的,win10算是吸引了大众的眼球了,而最新的.net5框架更是ok。 最新的.net5进行了开源,同时利用nuget以及node和bower进行了跨

话说今年微软是很给力的,win10算是吸引了大众的眼球了,而最新的.net5框架更是ok。

最新的.net5进行了开源,同时利用nuget以及node和bower进行了跨平台化;这意味这可以直接在mac或者linux上使用.net进行开发。

而最新的mvc5和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<audio> audio { get; set; }
 }
}

一个歌唱家,有个名字和年龄,然后有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<audio> audio { get; set; }
  public dbset<artist> artists { get; set; }
 }
}

这里只需要添加两个表就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<musiccontext>();
   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<musiccontext>(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<audio> get()
  {
   return db.audio.tolist();
  }

  [httpget("{name}")]
  public audio get(string name)
  {
   audio audio = db.audio.where(a => (a.name == name)).firstordefault();
   return audio;
  }
 }
}

一个属性,两个方法。

在这里我们可以看见 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=http://localhost:5000

可以找到我们访问的url,运行后把url拷贝到浏览器运行就ok。
运行情况下你会看见这样的窗口,可以看出其实是调用的dnx进行运行的程序。而 dnx 是可以跨平台的,这也就意味着可以直接在mac上跑起来。
这里写图片描述

效果

可以看出两个方法的接口调用结果是ok的。

初识asp.net mvc5+ef7的旅程到这里就结束了,希望可以为大家开启asp.net mvc5+ef7的又一个美妙旅程。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网