相关疑难解决方法(0)

使用Entity Framework时有哪些好的设计实践

这主要适用于不通过soa访问数据的asp.net应用程序.这意味着您可以访问从框架加载的对象,而不是转移对象,尽管某些建议仍然适用.

这是一个社区帖子,所以请在您认为合适时添加.

适用于:Visual Studio 2008 sp1附带的Entity Framework 1.0.

为什么首先选择EF?

考虑到这是一项存在大量问题的年轻技术(见下文),为您的项目加入EF可能很难.然而,这是微软正在推动的技术(以牺牲Linq2Sql为代价,它是EF的一个子集).此外,您可能对NHibernate或其他解决方案不满意.无论是什么原因,都有人(包括我)与EF合作,生活也不错.你想.

EF和继承

第一个重要的主题是继承.EF确实支持以两种方式持久化的继承类的映射:每个类的表和表的层次结构.建模很简单,该部分没有编程问题.

(以下适用于每个类模型的表,因为我没有每个层次结构的表的经验,无论如何,这是有限的.)当您尝试运行包含一个或多个对象的查询时,真正的问题就出现了.继承树:生成的sql非常糟糕,需要很长时间才能被EF解析并且需要很长时间才能执行.这是一个真正的表演塞子.足够的EF应该不能用于继承或尽可能少.

这是一个多么糟糕的例子.我的EF模型有~30个类,其中约10个是继承树的一部分.在运行查询以从Base类获取一个项目时,就像Base.Get(id)一样简单,生成的SQL超过50,000个字符.然后,当您尝试返回一些关联时,它会退化甚至更多,就抛出SQL异常而言,无法一次查询超过256个表.

好的,这很糟糕,EF概念允许您在没有(或尽可能少)考虑表的实际数据库实现的情况下创建对象结构.它完全失败了.

那么,推荐?如果可以的话,避免继承,性能会好得多.在必要的地方谨慎使用它.在我看来,这使得EF成为用于查询的美化sql生成工具,但使用它仍然有优势.以及实现类似于继承的机制的方法.

使用接口绕过继承

尝试使用EF进行某种继承时,首先要知道的是,您不能将非EF建模类指定为基类.甚至不尝试它,它将被建模者覆盖.那么该怎么办?

您可以使用接口来强制该类实现某些功能.例如,这里有一个IEntity接口,允许您定义EF实体之间的关联,您在设计时不知道实体的类型.

public enum EntityTypes{ Unknown = -1, Dog = 0, Cat }
public interface IEntity
{
    int EntityID { get; }
    string Name { get; }
    Type EntityType { get; }
}
public partial class Dog : IEntity
{
   // implement EntityID and Name which could actually be fields 
   // from your EF model
   Type EntityType{ get{ return EntityTypes.Dog; } } …
Run Code Online (Sandbox Code Playgroud)

asp.net entity-framework visual-studio-2008

74
推荐指数
1
解决办法
1万
查看次数

实体框架导致数据库视图的差异

我在我的数据库中创建了一个特定的视图(使用左连接加入约5-6个表).这个视图被添加到我的edmx(实体框架1.0).最近我注意到使用edmx(linq到实体然后ToList())获得的一个列记录多次重复,但在数据库视图中它们是不同的

Column-N (Expected result/ result from DB view)
---------
data1
data2
data3
data4
data5

Column-N(Actual result generated by entity framework)
---------
data1
data1
data1
data1
data1
Run Code Online (Sandbox Code Playgroud)

我启动了我的SQL分析器,得到了我的应用程序发送到SQL Server的查询,运行它并返回给我预期的结果.

MSDN 在这里和这里有类似的帖子,但主持人还没有详细说明如何解决这个问题.我的密钥碰巧是GUID

您指出的根本原因我认为是正确的,问题出在应用程序端EF映射上,因为EF与数据库有不同的对象映射规则.当从数据库返回查询结果时,EF将根据自己设计的逻辑对应用程序内存进行映射.

在数据库端设置视图查询时,将这些逻辑考虑在内是很重要的.我认为你应该对你的视图查询做一些调整.

我不确定您是否对问题进行了排序,如果没有,请提供与此问题相关的数据库结构和您编写的视图查询.

谢谢宾兹

有人之前遇到过类似的问题吗?

linq-to-entities entity-framework linq-to-sql

16
推荐指数
1
解决办法
3442
查看次数