webapi框架搭建-数据访问ef code first
2021-02-20 20:17
为什么用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 DbSetTestTables { 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自动创建的数据库
文章标题:webapi框架搭建-数据访问ef code first
文章链接:http://soscw.com/index.php/essay/58126.html