Entity framework 我应该坚持实体框架吗?

Entity framework 我应该坚持实体框架吗?,entity-framework,Entity Framework,我在新的互联网应用程序中采用了EF(现成的.NET4.5) 该应用程序确实涉及到相当多的db活动操作,并且涉及大约30个或更多的表 我的观点是,这不是一个简单的学校项目,EF通常适合大多数需求 随着我进一步开发这个应用程序,我发现EF对于正确/良好的db设计非常有限或禁止(特别是在性能方面) 1) 包括 我在查询部分遇到了Include特性。许多数据丢失是由于缺少包含设置 我投入的越多,我就越担心一个简单的数据检索会得到比我在某些函数中需要的更多的东西 2) 验证 为了满足这一需求,我采用了Fl

我在新的互联网应用程序中采用了EF(现成的.NET4.5)

该应用程序确实涉及到相当多的db活动操作,并且涉及大约30个或更多的表

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

随着我进一步开发这个应用程序,我发现EF对于正确/良好的db设计非常有限或禁止(特别是在性能方面)

1) 包括

我在查询部分遇到了Include特性。许多数据丢失是由于缺少包含设置

我投入的越多,我就越担心一个简单的数据检索会得到比我在某些函数中需要的更多的东西

2) 验证

为了满足这一需求,我采用了Fluent验证,因为我更喜欢visitor模式,在该模式中,不需要对数据代码本身进行直接的代码更改

但随着子类化,我会遇到更多的挑战,我需要能够尊重OOP简单的东西。我管理了它,尽管在它的实现中有更多的复杂性和某些我真的不喜欢的东西。我相信这个子类验证问题也发生在DataAnnotation中

3) 交易

现在,我需要加入适当的db Transact-Action控制,我发现EF中缺少这个,如果我错了,请纠正我

我曾经使用企业组件(很久以前在.NET中使用COM+),但在EF中找不到合适的(或缺少)事务实现

我还在做这个

(总结)

我逐渐意识到EF在我的编码中唯一帮助我的是数据/实体代码生成,这是许多其他工具/框架的共同特征

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

我可以不使用SQL LINQ,因为我过去在性能问题上遇到了很多挑战


我喜欢你的观点,我应该坚持EF,不管出于什么原因,我的头脑简单,除了这个ORM,它几乎不现实地工作。

你有没有研究过Dapper?Dapper是一种超快速的微型ORM。它是由Stackoverflow的人(Sam Saffron)开发的,他们在这个网站上广泛使用它的原因正是您提到的性能和速度。以下是链接:

我们抛弃了EF,只使用Dapper。结合其他一些社区开发的Dapper扩展,如Dapper.SimpleCRUD和Dapper.SimpleCRUD.ModelGenerator,我们可以从数据库快速生成POCO,同时保留Dapper相对于EF的所有优势。总的来说,您将编写更多的代码,但Dapper的速度几乎相当于使用ADO.NET的SqlDataReader。以下是指向SimpleCRUD的链接:


我同意,当你超过某个阶段时,EF就没那么有用了

如果您的数据库在应用程序之外很有用,那么为您的企业设计数据库,而不仅仅是为您的应用程序设计数据库。这就是EF下降的地方。它不(不能)考虑需要的其他玩家在数据库上的不同观点,所以最终你会有幼稚的索引和关系。

我的2c(快速回答一个非常复杂的问题):

编写SPs(是的,我知道)来管理数据收集,为业务层提供有用的数据集,并允许插入/更新基础表。不过,请确保编写了一个有用的数据API,不要只为每个表编写CRUD。那是毫无意义的浪费时间

使用EF连接到这些SP。EF生成有用的数据类,为您提供一个事务包装器和许多其他有用的BIT&BOB

享受吧


没有一个工具可以做所有的事情-根据情况选择。

老实说,几年前我仍然建议任何.net/sql新手使用EF,因为linq语法,它看起来很性感。。。 但仅此而已。老实说,你从英孚那里得不到任何其他好处

我知道用C#代替SQL的诱惑在一开始听起来可能非常有用,但事实并非如此。任何机器生成的sql都无法击败手工制作的sql beast,最终您将拥有它:)

除此之外,EF只是在消耗内存,这是web服务器的内存和CPU,嗯,在大多数情况下,我认为,但不确定。不过,它在性能和记忆方面消耗了更多的资源

我完全受够了20磅重的edmx模型GUI+每桌1英镑:)浪费了这么多时间使edmx与实际DB保持同步,到底是什么原因?谁说你需要在VS中为你的桌子添加彩色图标,真的?所有这些东西的存在只是为了一个也是唯一的原因——使linq到实体成为可能。让我见鬼去吧,我只是觉得原来的SQL看起来一点也不差

所以,不久前我自己做了一个决定——我的个人项目没有EF。
没有笨重的东西,当你把它变得简单的时候,生活就简单了。

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

ORMlite:

1) 从C#类创建表,包括关系、约束等。。(代码优先)

2) 可以进行插入、删除、更新等操作

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

Petapoco:

提供程序非常好的SQL包装类,我使用它而不是linq

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

我喜欢上面的风格,而不是林克。这也支持连接(很酷吧?)

目前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("ID=@0",100).AND("Active=@0",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
//创建实体类
公共类雇员:DatabaseEntity
{
//定义属性
}
//DatabaseEntity是我自己的基类,它提供了许多帮助器方法