.net ORM比较
我和某人讨论了实体框架,我还不是很喜欢它,但我想学习它。然而,我仍然有点困惑我是否应该学习它。我听到很多人说你不应该使用实体框架,但是我没有听到任何关于为什么会这样的争论 所以我的问题是,使用实体框架的利弊是什么。像.net ORM比较,.net,orm,comparison,.net,Orm,Comparison,我和某人讨论了实体框架,我还不是很喜欢它,但我想学习它。然而,我仍然有点困惑我是否应该学习它。我听到很多人说你不应该使用实体框架,但是我没有听到任何关于为什么会这样的争论 所以我的问题是,使用实体框架的利弊是什么。像 亚硝酸铵 DataObjects.Net 等等 在易用性、可测试性、语义方面 我知道这里面有一些。但它们都有点过时(20082009),老实说,这些论点也缺少一些东西。我知道EntityFramework4.0是可用的,但我还没有找到一个好的(完整的)比较 答案 这里的一些好
- 亚硝酸铵
- DataObjects.Net
- 等等
答案 这里的一些好人通过解释不同框架的一些细节回答了我的问题。我想最好在这里展示一下,以备将来参考
- 希望这些都能有所帮助
interface ICatalog
{
IEntitySet<Article> { get; }
void Save();
}
interface IEntitySet<T> : IQueryable<T>
{
void Add(T);
void Remove(T);
}
class EntityFrameworkCatalog : ICatalog
{
...
}
尽管EF现在可以从存储器返回这些序列化文档,并将它们写入存储器,但需要拦截文章的存储,并将简单文档替换为EntityFrameworkDocument one,以确保EF可以对其进行序列化。我相信其他ORM很容易做到这一点,而且情况会变得更糟。目前,没有办法对System.Uri类(不可变,但在其他情况下可以工作)或枚举执行相同的操作。除了这些限制外,您还可以使EF满足您的大多数需求。但是你会花很多时间在上面(就像我一样)
由于我对其他ORM的经验有限,我将总结如下:
- 实体框架在GAC中,甚至在客户端概要文件中
- 可以自定义实体框架来表示甚至复杂的实体类型(包括一些自引用的多对多,例如,或上面的XML序列化)
- 它可以被“抽象”掉,所以你可以坚持IRepository等
- IQueryable实现(尽管它没有DataObjects.Net那么完整)
- 它只需要System.Data和System.Data.Entity,您甚至可以为通常需要引用的其他提供程序包含多个存储架构,但如果您坚持使用DbConnection,则可以执行以下操作: ICatalog创建(DbConnection连接,string-storageSchemaPath) ICatalog CreateMySql(数据库连接mySqlConnection) { 返回创建(连接)res://Assembly/Path.To.Embedded.MySql.Storage.ssdl"); }
我最近发现,如果您的实体和“catalog”实现位于同一个程序集中,那么您可以为XML序列化过程使用内部属性。因此,您可以将名为
Xml
的内部属性添加到Document
类本身,而不是从Document
派生内部EntityFrameworkDocument
。这仍然只适用于对实体拥有完全控制权的情况,但它不需要截取对目录的任何更改,以确保使用派生类。CSDL看起来是一样的,EF只允许映射属性是内部的。我仍然必须确保这在中等信任环境中起作用。由于J.Tihon在解释EF特性方面做得很好,我只列出NHibernate围绕EF运行的领域:
- 缓存
- 英孚拥有
class Document : IXmlSerializable { } class Article { public virtual Document Content { get; set; } } internal class EntityFrameworkDocument : Document { public string Xml { get { // Use XmlSerializer to generate the XML-string for this instance. } set { // Use XmlSerializer to read the XML-string for this instance. } } }
- 英孚拥有