在 .NET Core 中选择正确的对象关系映射 (ORM) 工具可能是开发生命周期中的关键决策。所选的 ORM 会影响应用程序的性能、可维护性和可伸缩性。在本文中,我们将深入分析三个突出的 ORM 选择:Entity Framework Core、Dapper 和 NHibernate。
每个 ORM 都有其优点和缺点,我们将通过实际的代码示例来探索它们。1. 实体框架核心实体框架核心(EF Core)是Microsoft的官方ORM,以其简单性和与其他Microsoft技术的集成而闻名。它支持各种数据库提供程序,并遵循约定优先于配置的方法。让我们深入研究一个详细的例子:模型定义public
在 .NET Core 中选择正确的对象关系映射 (ORM) 工具可能是开发生命周期中的关键决策。所选的 ORM 会影响应用程序的性能、可维护性和可伸缩性。在本文中,我们将深入分析三个突出的 ORM 选择:Entity Framework Core、Dapper 和 NHibernate。每个 ORM 都有其优点和缺点,我们将通过实际的代码示例来探索它们。
Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。
EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:
让我们深入研究一个详细的例子:
- public class Blog
- {
- public int BlogId { get; set; }
- public string Url { get; set; }
- public int Rating { get; set; }
- public List
Posts { get; set; } - }
-
- public class Post
- {
- public int PostId { get; set; }
- public string Title { get; set; }
- public string Content { get; set; }
-
- public int BlogId { get; set; }
- public Blog Blog { get; set; }
- }
- public class BloggingContext : DbContext
- {
- public DbSet
Blogs { get; set; } - public DbSet
Posts { get; set; } -
- protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
- {
- optionsBuilder.UseSqlServer(
- @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True");
- }
- }
-
- using (var db = new BloggingContext())
- {
- var blogs = db.Blogs
- .Where(b => b.Rating > 3)
- .OrderBy(b => b.Url)
- .ToList();
- }
- using (var db = new BloggingContext())
- {
- var blog = new Blog { Url = "http://sample.com" };
- db.Blogs.Add(blog);
- db.SaveChanges();
- }
虽然 EF Core 善长提取许多编程详细信息,但还是有一些适用于任何 O/RM 的最佳做法,可帮助避免生产应用中的常见陷阱:
nvarchar(max) 和 decimal(18, 2) 极少成为最佳类型,但这些是 EF 使用的默认值,因为 EF 不了解你的具体情况。Dapper 主要能够让你练习你的 SQL 技能,按你认为的那样构建查询和命令。它接近于“金属”而非标准的 ORM,免除了解释查询的工作。Dapper 可以通过其 API 为你执行查询以及—假如查询结果的架构与目标类型的属性相匹配—自动实例化对象并向对象填充查询结果。此处还有另一个显著的性能优势: Dapper 能够有效缓存它获悉的映射,从而实现后续查询的极速反序列化。
- public class DapperDesigner
- {
- public DapperDesigner() {
- Products = new List
(); - Clients = new List
(); - }
- public int Id { get; set; }
- public string LabelName { get; set; }
- public string Founder { get; set; }
- public Dapperness Dapperness { get; set; }
- public List
Clients { get; set; } - public List
Products { get; set; } - public ContactInfo ContactInfo { get; set; }
- }
var designers = sqlConn.Query<DapperDesigner>("select * from DapperDesigners");
var sql = @"select * from DapperDesigners D JOIN Products P ON P.DapperDesignerId = D.Id"; var designers= conn.Query<DapperDesigner, Product,DapperDesigner> (sql,(designer, product) => { designer.Products.Add(product); return designer; });
Dapper 是精确控制 SQL 查询和高性能数据访问至关重要的场景的绝佳选择。它对于读取密集型应用程序特别有用。
Dapper使用查询用的是原始的SQL。
NHibernate是Hibernate的C#版,众所周知Hibernate是Java 里ORM的顶梁柱。与EntityFramework不同的地方是,Hibernate以配置文件为主,通过配置文件规范使用,Object/Relation 映射。而NHibernate这继承了这一点,也是以配置文件优先
- 需要创建一个项目用的配置文件:App.config.
-
- C# 项目中,除了Web类型的项目,每个项目的主配置文件的名称都是App.config,这是一个固定名称。
-
- 文件内容如下:
-
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- </configuration>
- 在 configuration节点之间添加以下内容:
-
- <configSections>
- <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
- </configSections>
- 这段代码的含义是,在config文件中添加一个 hibernate-configuration结点,结点的解析由类:NHibernate.Cfg.ConfigurationSectionHandler,所在包是NHibernate。
-
- 在App.config文件configuration结点中添加以下代码:
-
- <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
- <session-factory>
- <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
- <property name="connection.connection_string">
- Data Source=.;Initial Catalog=Demo;Integrated Security=True
- </property>
- <property name="hbm2ddl.auto">create-drop</property>
- <mapping assembly="dataprovider" />
- </session-factory>
- </hibernate-configuration>
- 这是固定格式,其中dialect表示使用的数据库类型,connection.connection_string 表示连接字符串。mapping表示映射关系文件所在项目。
- 然后获取一个ISessionFactory:
-
- Configuration cfg = new Configuration();
- var sessionFactory = cfg.BuildSessionFactory();
- 当然,如果直接运行代码的话,会在 BuildSessionFactory这里报错。因为没有为SQL Server安装数据访问驱动:
-
- System.Data.SqlClient
- 将数据访问驱动安装成功后,运行可以获得sessionFactory。
-
- sessionFactory用来创建一个访问数据库的Session
- 先来个简单的示例类:
-
- public class Cat
- {
- public virtual string Id { get; set; }
- public virtual string Name { get; set; }
- public virtual char Sex { get; set; }
- public virtual float Weight { get; set; }
- }
- NHibernate的映射关系文件:Cat.hbm.xml
-
- <?xml version="1.0" encoding="utf-8" ?>
- <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="dataprovider" assembly="dataprovider">
- <class name="Cat" table="Cat">
-
- <!-- A 32 hex character is our surrogate key. It's automatically
- generated by NHibernate with the UUID pattern. -->
-
-
-
-
-