C# 实体框架设计-多个“;“意见”;对于数据

C# 实体框架设计-多个“;“意见”;对于数据,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有一个关于实体框架实体的设计问题 我创建了以下实体: public class SomeEntity { // full review details here } 例如,该实体有30列。当我需要创建一个新实体时,这非常有效。我有所有必需的字段,以便插入到数据库中 在我的应用程序中,我有几个地方需要显示一些表格数据和来自某个实体的一些字段,但我不需要全部30列,可能只有2或3列 我是否创建了一个全新的实体,它只包含我需要的字段(映射到与SomeEntity相同的表,但只检索我想要的列

我有一个关于实体框架实体的设计问题

我创建了以下实体:

public class SomeEntity {
    // full review details here
}
例如,该实体有30列。当我需要创建一个新实体时,这非常有效。我有所有必需的字段,以便插入到数据库中

在我的应用程序中,我有几个地方需要显示一些表格数据和来自某个实体的一些字段,但我不需要全部30列,可能只有2或3列

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

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

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

我不确定做这类事情的合适方式是什么。让两个实体映射到同一个表/列是个坏主意吗?我永远不会真正需要创建PartialEntity并将其保存到数据库中的功能,因为它不会包含所需的所有字段。

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

我认为基于相同数据结构添加第二个实体会给模型增加不必要的复杂性。老实说,我不认为使用单个实体进行更新\编辑\查看有什么问题。如果您坚持分离对SomeEntity的访问,您可以拥有一个数据库视图:即SomeEntityView,并在此基础上创建一个单独的实体

您提出的第一个解决方案是“视图模型范例”,您创建一个类的唯一目的是作为视图的模型来检索数据,然后将其映射到模型类。您可以使用AutoMapper映射这些值。这里有一个关于如何应用的示例。

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

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


如果您正在使用EDMX文件进行映射(我想您不会,因为您提到了),那么可以使用第三种方法,这两种方法都有一部分。该方法定义了一个基于EF的视图,该视图基于映射实体,作为一个新的只读实体。通常,它是直接存储在映射中的可重用投影。

我们目前正在使用AutoMapper创建视图模型。这种情况略有不同,因为我不希望选择整个实体的效率低下。如果使用此查询检索到1000行:var data=从db.main实体中的a中选择a;然后将映射应用到我的较小类型,我很确定EF不会进行更智能的查询。这就是为什么我要问我是否应该创建一个较小的实体,或者自己编写查询来进行“映射”,那么我的第二种方法呢。仅仅创建一个POCO并编写一个查询,通过查询我的实际实体返回该对象,这是否有效?