C# 何时不使用实体框架

C# 何时不使用实体框架,c#,.net,entity-framework,architecture,C#,.net,Entity Framework,Architecture,我一直在玩EF,看看它能处理什么。还有许多文章和帖子解释了EF可以使用的各种场景,但是如果不知何故错过了“con”的一面。现在我的问题是,在什么样的情况下我应该远离实体框架 如果您在这方面有一些经验,请告诉我哪些场景不适合EF。请告诉我您在选择其他技术时遇到的一些缺点。一个潜在的大问题:Entity Framework 1.0不支持持久性。这意味着您的业务层依赖于您的数据访问层 如果您的整个应用程序将托管在同一进程中(如IIS上的网站),那么这没有问题 但是,如果您需要远程实体(例如,到Silv

我一直在玩EF,看看它能处理什么。还有许多文章和帖子解释了EF可以使用的各种场景,但是如果不知何故错过了“con”的一面。现在我的问题是,在什么样的情况下我应该远离实体框架


如果您在这方面有一些经验,请告诉我哪些场景不适合EF。请告诉我您在选择其他技术时遇到的一些缺点。

一个潜在的大问题:Entity Framework 1.0不支持持久性。这意味着您的业务层依赖于您的数据访问层

如果您的整个应用程序将托管在同一进程中(如IIS上的网站),那么这没有问题

但是,如果您需要远程实体(例如,到Silverlight或Windows Mobile客户端),那么您的实体将不容易跨线路进行序列化。您必须创建单独的数据传输类来跨线路发送实体,并创建额外的逻辑来封送实体类和DTO之间的数据


编辑:拼写。

由于EF不支持POCO,因此很难针对它编写好的单元测试。这是世界上对它的打击之一


如果你想写出好的测试,EF会设置障碍。你可以,但这不是小事。

我也正处于“玩转”阶段,尽管我担心缺乏内置的持久性不可知论,但我确信会有一个“工作转”

事实上,甚至在n层体系结构中也没有解决方案

WCF+EF

如果我读的正确,那么我看不到跨线路序列化实体(使用WCF)有任何问题,而且持久性忽略也不是问题

这是因为我主要使用PI进行单元测试

可以进行单元测试!(我想)

在这个系统中,我们可以简单地使用模拟服务(例如,通过将对服务的调用封装在另一个基于接口的类中,该类可以从工厂生成)。这将测试我们的演示者代码(没有必要对EF/DAL进行单元测试——这是微软的工作!)当然,仍然需要进行集成测试才能获得充分的信心

如果您想写入一个单独的数据库,这将在DAL层中完成,可以通过配置文件轻松实现

我的一便士价值

我的意见是——对EF下定决心,不要被所有关于它的厄运和阴霾所拖累,因为它正在进行循环。我想这会持续一段时间,微软将在明年左右解决这些问题。根据丹·西蒙斯的说法,PI肯定会出现


编辑:我刚刚意识到我是跳了枪,就像一个好的政治家一样,实际上没有回答被问到的问题。哎呀。但我会留着它,以防其他人发现它有用。

并非所有数据模型都能很好地映射到应用程序实体。如果映射不是相对简单的,我会跳过实体框架。你会发现你自己在做倒立动作,这样做没有任何明显的好处

Anders Hejlsberg对对象/关系映射发表了一些有趣的评论。

在那些认为自己知道哪些功能及其实现适合ORM/Datamapper框架的人眼中,这些列表列出了一些错误步骤和/或功能缺失的部分

如果这些问题对你来说都不是什么大问题,那么我不明白你为什么不应该使用它。我还没有听说这是一个到处乱炸的马车。对它的所有警告都是哲学的。我碰巧同意投不信任票,但这并不意味着你应该这样做。如果你碰巧喜欢EF的工作方式,那就去做吧。同时,我建议你至少读一读不信任投票,试着对每一个问题都有一个基本的了解,以便做出明智的决定


除此之外,也是您问题的核心——您需要关注正在生成的Sql,以便在性能问题进入生产之前进行调整。即使您在后端使用procs,我仍然会寻找可能多次访问数据库的场景,然后相应地修改映射或获取场景

尽管SQL CE 3.5 SP1和Entity Framework 4.0 Beta 1都支持标识列,但同时使用这两种产品(至少在列出的版本之前),标识列不受支持。您需要自行设置主键


除此之外,我一直在享受SQL CE的EF。

这难道不能通过这种方式解决:通过WCF Web服务(使用ADO.NET数据服务)发布实体,并通过客户端应用程序上的代理使用实体吗。。那不管用吗?是的,可以(我想!)。看看我的答案!这并不是真的正确-您可以从ObjectContext中删除实体,将它们发送到任何地方进行处理,然后返回并将它们附加回ObjectContext,以便持久化回数据存储。这是一个新手EF问题-我不认为您可以将存储过程与EF一起使用?我的印象是,正如你所说,所有的SQL都是自动生成的。看起来是这样,但我没有使用它的经验。话虽如此,与所有具有动态SQL引擎的o/r映射程序一样,我只建议在生成的SQL有问题的情况下使用PROC。@Daniel:+1表示“所有针对它的警告都是哲学性的”。不信任投票读起来像博士论文@邓肯:你可以将存储过程与EF一起使用。如果您不喜欢自动生成的SQL(到目前为止我还没有遇到问题,但这是可能的),或者如果您希望将现有的基于存储过程的应用程序缓慢地移植到EF,那么这非常方便。我相信唯一真正有效的argum