实体框架设计 - 数据的多个“视图”

时间:2011-10-10 21:20:48

标签: c# entity-framework ef-code-first

我有一个与实体框架实体相关的设计问题。

我创建了以下实体:

public class SomeEntity {
    // full review details here
}

此实体以30列为例。当我需要创建一个新实体时,这很有用。我有所有必填字段,以便插入数据库。

我的应用程序中有一些地方需要显示一些表格数据和SomeEntity中的一些字段,但我不需要所有30列,可能只有2或3列。

我是否创建了一个全新的实体,它只包含我需要的字段(与SomeEntity映射到同一个表,但只检索我想要的列?)

或者创建域类(如PartialEntity)并编写如下查询更有意义:

var partialObjects = from e in db.SomeEntities
                     select new PartialEntity { Column1 = e.Column1, Column2 = e.Column2 };

我不确定做这种事情的适当方法是什么。有两个实体映射到同一个表/列是不是一个坏主意?我实际上永远不需要能够创建PartialEntity并将其保存到数据库中,因为它不会包含所有必需的字段。

4 个答案:

答案 0 :(得分:2)

您提出的第一个解决方案是“视图模型范例”,您可以在其中创建一个类,其唯一目的是成为视图模型以检索数据,然后将其映射到模型类。您可以使用AutoMapper映射值。这是关于如何应用此问题的article

答案 1 :(得分:2)

您的第一种方法是不可能的。 EF不支持映射到同一个表的多个实体(除了一些特殊情况,如TPH继承或表拆分)。

第二种情况是常见情况。您将为UI创建视图模型,并将您的实体投影到查询中直接查看模型(它将仅从您投影的DB中传递)或者您将查询整个实体并转换为在应用程序代码中查看模型(例如, AutoMapper为@Fernando提到)。

如果您正在使用EDMX文件进行映射(我猜你不是因为你提到),你可以使用第三种方法,它参与了两种提到的方法。该方法定义QueryView - 它是映射实体的基于EF的视图,其表现为新的只读实体。通常,它是可重复使用的投影,直接存储在映射中。

答案 2 :(得分:1)

您可以创建一个接受对象实例的通用属性过滤器方法,并传入一个列名称的字符串数组,此方法将返回一个只包含所需列的动态对象。

答案 3 :(得分:1)

我认为这会为您的模型增加不必要的复杂性,以便根据相同的数据结构添加第二个实体。老实说,我没有看到单个实体更新\编辑\查看的问题。如果您坚持将访问权限分离为SomeEntity,则可以拥有数据库视图:即SomeEntityView,并基于创建一个单独的实体