2013-07-15 61 views
11

我在新的互联网网络应用程序中采用了EF(.NET 4.5以上版本)。我应该坚持实体框架吗?

这个应用程序确实涉及到数据库活动的一些操作,并涉及大约30个或更多的表。

我的观点是这不是一个简单的学校项目,EF通常适合大多数需求。

进一步我开发这个应用程序,我发现EF非常有限或禁止进行适当/好分贝的设计(尤其是在性能方面)

1)包括

我遇到包括特征查询部分。缺少许多数据是由于缺少包含设置。

我把这个东西放得越多,我越担心一个简单的数据检索就是在某些功能上获得比我需要的更多的东西。

2)验证

我采用流利验证了这方面的需要,因为我更喜欢访问者模式,在需要的地方过来的数据代码本身没有直接的代码更改。

但随着我继承我越来越挑战,我需要锻炼验证能够尊重面向对象的简单的东西。我管理它,虽然更复杂,我真的不喜欢它的实现某些东西。我相信这个子类验证问题也发生在DataAnnotation中。

3)交易

现在,我需要把适当的分贝transactaction控制,我发现这个缺乏EF,纠正我,如果我错了。

我曾经使用过Enterprise组件(.NET中的COM +,很久以前),并且我在EF中找不到合适的(或缺少它)事务实现。

我还在这方面的工作...

结论)

我体会到英孚已经帮助我在我的编码的唯一的事情,是数据/实体代码生成,这这是这是许多其他工具/框架的共同特征。

我在考虑放弃这个EF,切换回pre-EF时代方法,采用存储过程,仍然是代码生成的表类(但不是EF或DBML)。

我可以不使用SQL LINQ,因为在过去的性能问题上我有很多挑战。

我喜欢你的观点,我应该留下来坚持EF,无论出于何种原因,我简单的头脑可以感知到,除了这个ORM,它几乎不切实际地工作。

+0

使用EF 6中的事务处理:https://msdn.microsoft.com/en-us/data/dn456843.aspx –

回答

9

你看过Dapper吗? Dapper是一个超快的微型ORM。它是由Stackoverflow人(Sam Saffron)开发的,他们在本站广泛使用它,原因是您提到的原因 - 性能和速度。这里是链接:

https://github.com/StackExchange/dapper-dot-net

我们放弃了EF,我们只使用Dapper。结合Dapper.SimpleCRUD和Dapper.SimpleCRUD.ModelGenerator等其他社区开发的Dapper扩展,我们可以快速从数据库生成POCO,同时保留Dapper对EF的所有优势。总的来说,你会写更多的代码,但Dapper的速度几乎等同于使用ADO.NET的SqlDataReader。这里有一个链接到SimpleCRUD:

https://github.com/ericdc1/Dapper.SimpleCRUD/

+2

我会问,如果Dapper实际上是ORM。它甚至呈现为对象映射器而不是全功能的ORM。 – Euphoric

+0

我一直在尝试采用Dapper,但最后也放弃了。我真的不喜欢它如何检索/查询数据。倾向于使用LINQ方式。 – Kelmen

+5

这里没有1个打孔解决方案。是的,如果你使用EF,你不必知道SQL,因为你可以使用LINQ,而EF会将你的LINQ转换成SQL查询。但是,这种翻译有成本,成本是时间。另一方面,Dapper会让你编写更多的代码,并且你必须知道SQL,但是你只会在应用程序中编写你需要的东西。 – Marko

2

我同意EF是那么有用,当你超过一定阶段

如果你的数据库是非常有用的超出你的应用程序,然后设计DB为您的企业,而不仅仅是你的申请。这是EF掉下来的地方。它没有(不能)考虑到其他需要的数据库上的不同观点,所以你最终得到了天真的索引和关系。

我2C(快速响应一个非常复杂的问题):

写的SP(是的,我知道)来管理数据的采集,为您的业务层提供有用的数据集,并允许插入/更新到您的基础表。确保你写了一个有用的数据API,但不要为每个表格写CRUD。这是毫无意义的浪费时间。

使用EF挂钩到这些SP中。 EF生成有用的数据类,给你一个事务包装器和其他有用的位bobs。

享受!

没有人会做任何事情 - 挑选&根据情况选择。

+0

这是什么EF事务包装?你能明确地管理它吗? – Kelmen

+0

就是这样的东西。我真的没有真正的术语http://msdn.microsoft.com/en-us/library/vstudio/bb896325(v=vs.100).aspx真的不那么令人兴奋,但它工作得很好。 – LoztInSpace

+0

什么是“SP”? –

0

说实话,我几年前还是会建议任何.net/sql新手去EF,因为linq语法,它看起来很性感...... 但是就这些而言。诚实地说,没有任何其他的东西可以从EF中获得。

我知道编写C#代替SQL的诱惑听起来很有用,但事实上并非如此。没有机器生成的sql可以击败手工制作的SQl野兽,你最终在一天结束时:) :)

除此之外,EF只是吃了内存,这是网络服务器的内存和CPU,在大多数情况下,我认为,但不确定。尽管如此,它在性能和内存方面消耗更多资源。

我完全厌倦了沉重的重20磅EDMX模型GUI的耳朵。每桌+1磅:)松动这么多时间让edmx与实际的数据库保持同步,究竟是什么原因?谁说你需要VS中所有色彩丰富的图标,真的吗?所有这些东西都只是为了一个,也是唯一的原因 - 让linq-to-entities成为可能。为了避免这种情况,我只是发现原始的SQL看起来不那么好或很酷。

所以,我自己做出了一段时间的决定 - 没有EF为我的个人项目。 没有繁重的越野车事情,生活很容易,当你采取和简化。

+0

使用C#sql的好处对于动态sql非常有用。使用传统SQL手写编码的 是一场噩梦。 – Kelmen

+0

@Kelmen这是你的意见。 –

+1

好处不仅仅是“你不需要知道SQL”,你也可以避免繁琐的代码编写,编译时检查可以减少很多错误的风险。显然存在权衡,但你的比较是从虚假的前提开始的。 EF本身所消耗的资源并不是那么重要,最大的代价是,如果每个人都是手动调整的,那么它所写的查询效率就不如他们所能达到的那么高。 – Casey

0

我有自己的数据访问层,使用服务堆栈的ORMlite和toptensoftware的PetaPoco创建。

ORMlite:

1)从C#类,包括关系,约束等创建表。(CodeFirst)

2)可以做的插入,删除,更新等。

示例 - 创建表:Employee.EnsureTable()

Petapoco:

提供者很棒的SQL包装类,我用它代替linq

例如:sql.Select(“FirstName,LastName”)。From(“Employee”)。Where(“ID = @ 0”,100) .AND(“Active = @ 0”,1)

我比LINQ更喜欢以上风格。这也支持Joins(Cool right?)

目前ORM lite不是免费的。但是你可以得到免费的旧版本。

例子:

//Creating Entity Class 

public class Employee:DatabaseEntity<Employee> 
{ 
    //Define properties 
} 

//DatabaseEntity is my own base class which provides many helper methods from ORM lite and Petapoco, including many static methods eg:EnsureTable() 

//Creating Table 

Employee.EnsureTable() 

//Adding new entity 
Employee e=new Employee(); 
e.FirstName="Chola" 
e.LastName="Raja" 
e.Active=true 
e.Save() 

//Find an employee 
e=Employee.FirstOrDefault(x=>x.ID==101 && x.Active==true); 
//OR 
e=Employee.QuerySingle(sql.Select("FirstName,LastName").From("Employee").Where("[email protected]",100).AND("[email protected]",1)) 

//update 
e.LastName="Raja" 
e.Save() 

//Delete a entity 
e.Delete() 

//Transaction 
e.AssignProject(project1) //this method could do many operation on many entities using Transaction scope 

注:我无法从我的项目中提取的代码。但您可以根据您的要求创建您自己的基类