Entity Framework优缺点及使用方法总结

Entity Framework优缺点及使用方法总结

Entity Framework是微软提供的一个ORM框架,它旨在为小型应用程序中数据层的快速开发提供便利。

nuget上185W多的下载量,说明.Net开发人员还是比较喜欢用EF的。但是EF在提供了便利性的同时也有许多缺点,以下就是我认为不应该应用EF的场景:

  • 非SQL Server数据库且无该数据库的DataProvider
  • 高性能要求。在进行一些复杂查询的情况下,EF的性能表现不太好,而开发人员又无法控制SQL语句的生成
  • 高安全性要求。有时候DB用户仅仅具有EXEC的权限,而EF自动生成的类又不好用,还是需要自己来写。

一些大中型企业应用往往具有以上几种情况,此时就不适合使用EF了。

至于使用什么ORM,我个人认为NHibernate配置起来太麻烦,如果没什么太特殊的要求,可以试一下ServiceStack.OrmLite能不能满足需求。或者直接上ADO.Net

如果非要使用EF,建议使用EF最新的稳定发布版本(支持DbContext+Code first方式开发)。

然后读一下《Programming Entity Framework Code First》和《Programming Entity Framework DbContext》这两本书(目前无中文版)。

使用DbContext+Code first POCO+Repository模式,这样既可以保证EF被Repository隔离,又可以保证可测试性,还能在需要更换ORM框架甚至是换成ADO.Net时少改一点代码。

提供示例代码下载(.Net 4+EF5)

示例代码中有POCO和EF的Configurations,把EF相关的Configurations单独拿出来保证了DB Model的纯洁性。在这里大体摘一点东西给大家看看

首先是数据库结构,我使用的是Code first,在第一次有实际的数据库操作的时候会自动生成数据库,生成后的数据库结构如下图:

数据库的生成策略在EFContext类的静态构造里面:

static EFContext(){   // 指定数据库生成策略为不存在时生成    // 还可以指定为:    // DropCreateDatabaseAlways(总是删除原有数据库重建)    // DropCreateDatabaseIfModelChanges(数据库模型改变后删除原有数据库重建)    Database.SetInitializer<EFContext>(new CreateDatabaseIfNotExists<EFContext>());}

Album表的Configuration设置:

public class AlbumConfiguration : EntityTypeConfiguration<Album>

{

  • public AlbumConfiguration()
  • {
  • // 指定数据表名
  • ToTable("dbo.Album");
  • // 设定主键
  • HasKey(x => x.Id);
  • // 设定数据列名及其它属性
  • Property(x => x.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
  • Property(x => x.AlbumName).HasColumnName("AlbumName").IsRequired().HasMaxLength(50);
  • Property(x => x.ArtistId).HasColumnName("ArtistId").IsRequired();
  • // 设置外键约束
  • HasRequired(foreignKeyTable => foreignKeyTable.Artist).WithMany(primaryKeyTable => primaryKeyTable.Albums).HasForeignKey(foreignKeyTable => foreignKeyTable.ArtistId);
  • // 设置多对多关联
  • HasMany(thisTable => thisTable.Tags).WithMany(anotherForeignKeyTable => anotherForeignKeyTable.Albums).Map(relationTable => relationTable.MapLeftKey("TagId").MapRightKey("AlbumId").ToTable("AlbumTags"));
  • }

}

重写EFContext类中的OnModelCreating函数,使用我们自定义的Configurations:

protected override void OnModelCreating(DbModelBuilder modelBuilder){
  • base.OnModelCreating(modelBuilder);
  • // 设定数据库生成配置
  • modelBuilder.Configurations.Add(new ArtistConfiguration());
  • modelBuilder.Configurations.Add(new AlbumConfiguration());
  • modelBuilder.Configurations.Add(new TagConfiguration());
}

Repository模式这里我就不多说了,具体看AbstractDbAccessor项目中的内容,

EF的Repository实现在ConcreteDbAccessor项目EntityFramework目录下的EFDbAccessor和Repository目录

时间: 2024-08-24 18:13:11

Entity Framework优缺点及使用方法总结的相关文章

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点

在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity Framework的背景信息,然后再详细学习如何搭建开发环境. 1.1 MVC和ASP.NET MVC 这本书涵盖Microsoft版本的MVC,即ASP.NET MVC.在写本书的时候,ASP.NET MVC的生产版本为MVC5,因此,本书的示例代码都使用ASP.NET MVC 5编写.在本书中

Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)

在使用Entity Framework加载关联实体时,可以有三种方式: 1.懒加载(lazy Loading); 2.贪婪加载(eager loading); 3.显示加载(explicit loading). EF默认使用的是懒加载(lazy Loading).一切由EF自动处理. 这种方式会导致应用程序多次连接数据库,这种情况推荐在数据量较大的情况下使用.当我们需要加载数据较少时,一次性全部加载数据会相对更高效. 我们来看看EF的显示加载(explicit loading)如何让我们完全掌控

如何在ASP.NET Core中应用Entity Framework

注:本文提到的代码示例下载地址> How to using Entity Framework DB first in ASP.NET Core 如何在ASP.NET Core中应用Entity Framework 首先为大家提醒一点,.NET Core和经典.NET Framework的Library是不通用的,包括Entity Framework! 哪怎么办? 别急,微软为.NET Core发布了.NET Core版本的Entity Framework,具体配置方法与经典.NET Framew

MVC5 Entity Framework学习之读取相关数据

前一篇文章中完成了School 数据模型,接下来你将学习如何读取和显示相关的数据--这里指Entity Framework加载至导航属性中的数据. 下图是完成后的效果图 延迟.预先和显示加载相关数据 Entity Framework可以通过多种方法向实体的导航属性中加载数据 延迟加载(Lazy loading) 当实体第一次被读取时,相关数据并不会被检索.但是,当你第一次访问导航属性时,该导航属性所需的数据会自动加载.这是向数据库发送多个查询语句的结果--一次是读取实体本身,接着是每次与被检索的

MVC5 Entity Framework学习之添加排序、筛选和分页功能

前一篇文章中实现了对Student 实体的的基本CRUD操作,在这篇文章中将演示如何为Students Index页面添加排序.筛选和分页的功能. 下面是当完成排序.筛选和分页功能后的截图,你可以点击列标题来进行排序. 1.为 Students Index页面添加列排序链接 要为Students Index页面添加排序功能,你需要修改Student controller的Index方法,并为Student Index视图添加代码. 向Index方法添加排序功能 打开Controllers\Stu

Entity Framework中使用DbCompiledModel中遇到的坑和解决方案

前段时间,在公司做项目时,引入Entity Framework Code First的方法. 我们公司的软件为SaaS结构,有N个企业注册,其中SQL Server中有一张表为t_User_企业注册号,比如第1000个来注册的企业,为它生成t_User_1000这张数据表. 这种方式下,如何生成User对象跟数据表的对应关系呢?直接在OnModelCreating里面直接ToTable来绑定? 如果稍懂点Entity Framework的实现细节,这种方式实现有一个很大的问题,就是OnModel

Entity Framework DbSet&lt;T&gt;之Include方法与IQueryable&lt;T&gt;扩展方法Include的使用

Entity Framework使用Code First方式时,实体之间已经配置好关系,根据实际情况某些情况下需要同时获取导航属性,比如获取商品的同时需要获取分类属性(导航属性),或者基于优化方面考虑等,下面来看一个例子 例子中有会员实体类(Member)与角色实体类(Role),Role与Member的关系是1:n,控制台应用程序代码如下: using System; using System.Collections.Generic; using System.Linq; using Syst

《Entity Framework 6 Recipes》中文翻译系列 (23) -----第五章 加载实体和导航属性之预先加载与Find()方法

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-2  预先加载关联实体 问题 你想在一次数据交互中加载一个实体和与它相关联实体. 解决方案 假设你有如图5-2所示的模型. 图5-2 包含Customer和与它相关联信息的实体 和5-1节一样,在模型中,有一个Customer实体,一个与它关联的CustomerType和多个与它关联的CustomerEamil.它与CustomerType的关系是一对多关系,这是一个实体引用(译注:Cu

Entity Framework SqlFunctions 教你如何在EF调用sqlserver方法的函数存根

今天算是研究了一天的SqlFunctions,请教了几个群的牛人,居然发现大伙对这个都比较陌生, 有的甚至直指EF中是不能调用sqlserver里的方法的. 因为之前搞过linq to sql 里面的SqlMethod ,所以觉得EF里面必须是可以的. 首先需要简短介绍一下EF6和EF5,当你NuGet一个EF5的包的时候,只有EntityFramework,而EF6确有EntityFramework和EntityFramework.SqlServer, 这2者是有很大区别的. 在EF5环境下,