rainit2006 / C-Program

C# Program knowledge
0 stars 0 forks source link

ORM, EF, Hibernate #6

Open rainit2006 opened 7 years ago

rainit2006 commented 7 years ago

A good tutorial website for Entity framework http://www.entityframeworktutorial.net/what-is-entityframework.aspx

8天掌握EF的Code First开发之Entity Framework介绍 http://www.cnblogs.com/farb/p/IntroductionToEF.html


http://www.cnblogs.com/Daywei/p/4866387.html

在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品。

实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术。在EF中的实体数据模型(EDM)由以下三种模型和具有相应文件扩展名的映射文件进行定义。 概念架构定义语言文件 (.csdl) -- 定义概念模型。 存储架构定义语言文件 (.ssdl) -- 定义存储模型(又称逻辑模型)。 映射规范语言文件 (.msl) -- 定义存储模型与概念模型之间的映射。

ADO.NET、NHibernate和Entity Framework的比较 http://www.cnblogs.com/pocn/p/5277544.html

Hibernate优点: (1)对象/关系数据库映射(Basic O/R Mapping) 它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想。 (2)透明持久化(Persistent) 带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通的JavaBeans/POJO,这个对象没有实现第三方框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。(例如,用作跟表示层打交道的数据传输对象。)
(3)事务Transaction (org.Hibernate.Transaction)应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。某些情况下,一个Session之内可能包含多个Transaction对象。尽管是否使用该对象是可选的,但无论是使用底层的API还是使用Transaction对象,事务边界的开启与关闭是必不可少的。 (4)它没有侵入性,即所谓的轻量级框架。 (5)移植性会很好。 (6)缓存机制。提供一级缓存和二级缓存。

Hibernate缺点: (1)Hibernate在批量数据处理的时候是有弱势。 (2)针对某一对象(单个对象)简单的查\改\删\增,不是批量修改、删除,适合用Hibernate;而对于批量修改、删除,不适合用Hibernate,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用Hibernate。

mybatis MyBatis はJavaならびに.NET Frameworkで利用可能な、XMLまたはアノテーションを用いてストアドプロシージャやSQL文をオブジェクトと紐付ける永続性フレームワークである。Apache License 2.0によるオープンソースソフトウェアとして提供されている。

特徴: 1.MyBatisは他のO/Rマッピングフレームワークとは異なりデータベースとオブジェクトをマッピングするのではなく、SQL文とオブジェクトのマッピングを行う。このため、MyBatisはレガシーな環境や非正規化されたデータベース、またはSQL文の実行を完全に制御したい場合に、よい選択肢となる。 2.MyBatisによるデータベースへのアクセスコードは、JDBCによるものより遥かに簡単である。通常の場合、SQL文の実行は1行のコードで完了する。よく見られるコネクションのクローズ漏れや、検索結果に1件を期待しているにも関わらず超過してしまうような問題を抑止できる。 3.MyBatisの一番の特徴は、XMLに記述したSQL文を普通のオブジェクトと組み合わせられることである。 また、MyBatisではオブジェクトとデータベースをマッピングするだけでなく、SQL文のインタフェースメソッド(マッパー)を作成することも出来る。この場合は、DIフレームワークと組み合わせることでMyBatis APIへの依存関係を排除することが出来る。このためにSpring Framework、Google Guiceとの連携がサポートされている。 4.MyBatisではデータキャッシュもサポートしている。XMLマッピングファイルに僅かな構文を追加するだけでキャッシュを有効にすることが可能である。MyBatisのキャッシュではOSCache, EhcacheそれにHazelcastとの連携がサポートされている。

rainit2006 commented 7 years ago

Entity Framwork在哪些场景下使用? https://www.zhihu.com/question/26225619

rainit2006 commented 7 years ago

LINQ和Entity Framework: EF是微软新推到的ORM解决方案,LINQ是之前的方案。

INQ to SQL和Entity Framework之关联 http://www.cnblogs.com/lifepoem/archive/2011/11/10/2244386.html LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术。他们之间的本质区别在于EF对数据库架构和我们查询的类型实行了更好的解耦。使用EF,我们查询的对象不再是完全对应数据库架构的C#类,而是更高层的抽象:Entity Data Model。这为我们提供了额外的灵活性,但是在性能和简单性上面也会有所损失。

LINQ to SQL由C#团队开发并在.NET Framework 3.5中发布,而Entity Framework由ADO.NET团队开发并作为.NET Framework 3.5 Service Pack 1的一部分发布。此后,LINQ to SQL由ADO.NET团队接手,其结果是:在.NET 4.0中,ADO.NET团队更加专注于EF的改进,相对来说,LINQ to SQL的改进要小得多。

LINQ to SQL和Entity Framework各有所长,LINQ to SQL是一个轻量级的ORM框架,旨在为Microsoft SQL Server数据库提供快速的应用程序开发,其优点是易于使用、简单、高性能。而Entity Framework的优点在于:其为创建数据库架构和实体类之间的映射提供了更好的灵活性,它还通过提供程序支持除了SQL Server之外的第三方数据库。

EF 4.0一个非常受欢迎的改进是它现在支持与LINQ to SQL几乎同样的查询功能。这意味着我们在系列文章中的LINQ-to-db查询可以同时适用于EF 4.0和L2S。而且,这也使得L2S成为我们学习使用LINQ查询数据库的理想技术,因为其保持了对象关系方面的简单性,并且我们学习到的查询原则和技术同样适用于EF。


EF将其作为LinqToSql(这货其实也挺牛)的升级替代品,其实有点不太合适。LinqToSql是针对微软自家数据库产品(SQL Server)的一个轻量级ORM(严格意义上不能算是),虽然方便好用,但不够大气。市面上别的ORM产品也不入微软法眼。于是微软祭出了自己的黑科技:EntityFramework。先是DbFirst、ModelFirst,从4.1版本起又加入了CodeFirst。EF目前支持的数据库除了微软自家的Sql、SqlCe外(据说ACCESS也支持,没用过),还支持Oracle、MySql、SqlLite等。

有人一直搞不清楚Linq与LinqToSql的关系,说出了EF后,Linq被抛弃了。实际上,被抛弃的是最初的LinqToSql。Linq家族有LinqToSql、LinqToEntity、LinqToXml、LinqToObject等。还有,“from……where……select”的写法,并不是Linq的全部,这些只是语法糖而已。Linq更多的是扩展方法。所有from……where……select能完成的事情,扩展方法都能完成;但所有扩展方法能完成的,from……where……select却不一定。Java8开始,貌似有了Jinq

rainit2006 commented 7 years ago

LINQ的作用 http://www.cnblogs.com/lifepoem/archive/2011/10/25/2223765.html 作为软件开发人员,我们很大一部分时间都花在了获取和操作数据上面。而说到数据,我们会自然而然地想到包含在关系数据库里的信息、使用的XML文档、保存在本地的DataSet、内存中的List列表等等。通常我们会对数据进行过滤和定位,查询出符合要求的那一部分数据。

在.NET 3.5之前的版本中,与特定的数据类型打交道时,我们要使用特定特定命名空间下的特定类型(不同的API)。

虽然这些操作数据的方法本身没有问题,比如我们都会直接使用ADO.NET、XML命名空间、反射服务以及各种集合类型。但是本质的问题在于,这些API的每一种本身只是一座孤岛,提供了很少的集成方式。比如我们可以把ADO.NET DataSet保存为XML,然后通过System.Xml命名空间来操作。但是各API之间没有替代品,我们没法用ADO.NET API来操作XML,也不能用System.Array来操作关系数据。

LINQ(语言级集成查询)的意图就是提供一种统一且对称的方式,让程序员在广义的数据上获取和操作数据。通过使用LINQ,我们能够在C#编程语言内直接创建被称为“查询表达式(query expression)”的实体。这些查询表达式是基于许多查询运算符(query operator)的,而且是有意设计成类似SQL表达式的。并且,查询表达式可以用来与多种数据进行交互,以一种统一的方式来操作各种数据。

LINQ中最基本的数据单元是sequences和elements 一个sequence是实现了IEnumerable的对象,而一个element是sequence中的每一个元素。如下,names就是一个sequence,”Tom”,“Dick”和”Harry”则是elements。 string[] names = { "Tom", "Dick", "Harry" };

rainit2006 commented 7 years ago

LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行。 这意味着,他们不是在查询创建的时候执行,而是在遍历的时候执行(换句话说,当enumerator的MoveNext方法被调用时)。

延迟执行带来的一个影响是,当我们重复遍历查询结果时,查询会被重复执行。 对策: 利用ToArray、ToList来避开重复执行,ToArray把查询结果保存至一个Array,而ToList把结果保存至泛型List<>:

 List<int> timesTen = numbers
                .Select(n => n * 10)
                .ToList();   // Executes immediately into a List<int>

延迟执行还有一个不好的副作用: 变量捕获 如果查询的lambda表达式引用了程序的局部变量时,查询会在执行时对变量进行捕获。这意味着,如果在查询定义之后改变了该变量的值,那么查询结果也会随之改变。 个特性在我们通过foreach循环创建查询时会变成一个真正的陷阱。

延迟执行的实现原理 查询运算符通过返回装饰者sequence(decorator sequence)来支持延迟执行。 和传统的集合类型如array,linked list不同,一个装饰者sequence并没有自己用来存放元素的底层结构,而是包装了我们在运行时提供的另外一个sequence。此后当我们从装饰者sequence中请求数据时,它就会转而从包装的sequence中请求数据。

rainit2006 commented 7 years ago

ntity Frameworkに新たに追加された「Code First」開発 EF 4.1の新機能であるコード・ファーストという開発スタイル。

データベース・ファースト(Database First)はEF登場時からサポートされており、すでに存在するデータベースからEDMを生成する開発スタイルである。データベースの構造からEDMをいわば逆算して構築するため、「リバース」と呼ばれることもある。このスタイルでは、すでに存在するデータベースに手を加えることなく、プログラムからアクセスするためのモデルを構築できる。

「モデル・ファースト(Model First)」とは、EF 4から追加された開発スタイルであり、まずEDMを設計し、そこからデータベース構造を自動生成する方法である。EDMは図2のようにビジュアルにデザインが可能なモデルであり、表形式の構造に基づくデータベースの限界を気にすることなく設計可能である。例えば、データベース上では中間テーブルが必要になる多対多関係なども、EDM上ではそのまま表現することができる。

EF 4.1の新機能である「コード・ファースト」は、これら2つの手法とは発想の異なる開発スタイルである。コード・ファーストでは、最初にPOCO*1としてエンティティ・クラスを定義し、そこから必要に応じてデータベースを自動生成する。データベース・ファーストやモデル・ファーストとは異なり、ソース・コードだけで開発を完結できるため、ビジュアルなエディタでEDMを明示的に定義する必要がなく、より迅速な開発が可能となる。また、特定のフレームワークに依存していないPOCOのエンティティ・クラスは、テストの記述、実行も容易である。