webapi框架搭建-数据访问ef code first

2021-02-20 20:17

阅读:626

为什么用ef?

  我相信很多博友和我一样都有这种“选择困难症”,我曾经有,现在也有,这是技术人的一个通病——总想用“更完美”的方式去实现,导致在技术选择上犹豫不决,或总是推翻别人的技术路线,甚至屡屡推翻自己从前的想法,这种专研的精神固然不错,但随着年龄的增大,会发现这种习惯已将自己弄得很累,其实真没有必要。我觉得技术上永远没有“完美”的解决方案,如果揪着缺点去比较和选择,不管最终选择了什么,以后都会后悔。因为你总是看到它身上的缺点。orm的框架也有很多,大家都说entityframework性能有点差,它生成的sql语句简直看不下去,我也考虑过dapper,但它要写一些sql语句,这不是我想干的事(纯属个人代码风格偏好)。分享下为什么会选择ef。我的orm框架的要求是这样的:1、简单快速上手(因为我不太想将太多的精力花在这上面,而ef各方法的资料还是很全的);2、性能只要过得去就行(又不是要开发对性能要求很苛刻的产品,我想微软的产品也不至于性能很低吧);3、后面如果要换数据库,最好不要改代码(这点是我喜欢ef的主要原因,只要将数据连接换一下,dll包换一下,数据库就可以从mysql,sqlserver,oracle任意切换)

 为什么用code first?

  1、代码简洁

    相比db first,code first的代码更简洁,基本所有的代码都是真正需要的。而db first有很多自动生成的辅助型的代码。

  2、编写简单

    db first在sqlserver下也简单,但如果是mysql或是oracle,在vs的配置上就会遇到很多问题,我初学时经常遇到vs连mysql失败,或是连接成功后总是生成代码时失败。而用code first,你只要写实体的代码就行,虽然是”多写了一些代码“,但其实速度上比db first还是快的。

参考资料

  推荐:http://www.entityframeworktutorial.net/code-first/entity-framework-code-first.aspx

  微软官方:https://msdn.microsoft.com/en-us/library/aa937723(v=vs.113).aspx

 

下面介绍如何实用

用法和步骤

引用相关包

  如果是sqlserver数据库,只要引用entityframework就行

  如果是mysql数据库,引用mysql.data.entity包(依赖mysql.data包)

    注意:在实际开发中发现有些版本的mysql.data.entity包是有bug的,如版本6.10.5,建议安装6.9.10(测试没有问题)

  如果是oracle数据库,引用oracle.managedDataAccess.EntityFramework包(依赖Oracle.ManagedDataAccess包)

    oracle注意:微软也出过oracle的连接库,但不支持ef,现在都提倡用oracle出的odp.net技术。而odp.net以前的版本是基于oracle.dataaccess.dll的,这个有x86和x64位之分,开发时很不方便,建议用oracle.managedDataAccess.dll.

  引用包后,会在web.config里自动生成如下相应的配置信息:

  1)在configuration--》configSections节点下面生成名为entityFramework的section

    

  2)

编写实体类

  如下代码

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace webapi.Entities
{
    [Table("Test")]
    public class TestTable
    {
        [Key,Column(TypeName = "varchar"),MaxLength(50)]
        public string Id { set; get; }
        [Column(TypeName = "int")]
        public int? Age { set; get; }
        [Column(TypeName = "datetime")]
        public DateTime? CreateDateTime { get; set; }
    }
}

  实体通过dataannotations的方式描述在数据库里类型,长度、主键等。没有必要死记他们的写法,不会时参考http://www.entityframeworktutorial.net/code-first/stringlength-dataannotations-attribute-in-code-first.aspx就行。

 编写数据库上下文

  1)创建继承自DbContext的类

using System.Data.Entity;

namespace webapi.Entities
{
    public class DB : DbContext
    {
        /// 
        /// name=DBConnection,DBConnection为数据库连接的名字,即web.config配置文件节点connectionStrings,name值为DBConnection的数据库连接字符串
        /// 
        public DB()
            : base("name=DBConnection")
        {
        }

        #region 配置所有的数据库表

        public DbSet TestTables { set; get; }

        #endregion

    }
}

  2)在web.config里配置数据库连接字符串

  由于数据库连接字符串比较重要,为方便,在实际的开发中经常单独配置在一个文件里,然后在web.config里去引用配置文件。

  创建ConnectionStrings.config文件,内容如下

  上面将常用的数据库的连接方式举例出来,以后要换数据库,只要按一下数据库的连接字符串就行。

编写测试接口

  code first的基本来法就上面三步了。我们来测试下是否正常。

  1)创建测试接口,代码如下:

using System.Linq;
using System.Web.Http;
using webapi.Entities;

namespace webapi.example
{
    public class EFTestController : ApiController
    {
        public IHttpActionResult Get()
        {
            using (DB db=new DB())
            {
                var list = db.TestTables;
                return Ok(list.ToList());
            }
        }
    }
}

  2)运行接口

  用postman访问接口地址(get方法):http://localhost:101/api/EFTest,返回结果为空json数组:[];

  注意:我的电脑上已经安装了mysql,但并没有webapi数据库啊,为什么接口正常运行呢?原因是entityframework会自动检测是否存在数据库,如果没有就会去创建。下面是ef自动创建的数据库

技术分享图片技术分享图片


评论


亲,登录后才可以留言!