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

Dis*_*ile 6 c# entity-framework ef-code-first

我有一个与Entity Framework实体相关的设计问题.

我创建了以下实体:

public class SomeEntity {
    // full review details here
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

var partialObjects = from e in db.SomeEntities
                     select new PartialEntity { Column1 = e.Column1, Column2 = e.Column2 };
Run Code Online (Sandbox Code Playgroud)

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

Lad*_*nka 2

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

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

如果您使用 EDMX 文件进行映射(我猜您没有这样做,因为您提到了),您可以使用第三种方法,该方法来自上述两种方法。该方法定义了QueryView - 它是映射实体上基于 EF 的视图,其行为相当于新的只读实体。一般来说,它是直接存储在映射中的可重复使用的投影。