欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-20 19:20:04
话说今年微软是很给力的,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

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

这里起名叫做:musicbank,就是一个音乐店吧。

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

在这里我们来一个空的就好。我们来自己建立model/ef….
ok,项目建立好了后,我们看见的是这样的。

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

可以看见我们的项目其实是在 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,右键-添加-新建项

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

在这里我就使用一个简单的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 命令行的方式。

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

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上跑起来。
这里写图片描述

效果

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

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

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

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

上一篇:

下一篇: