我有一个与实体框架实体相关的设计问题。
我创建了以下实体:
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并将其保存到数据库中,因为它不会包含所有必需的字段。
答案 0 :(得分:2)
您提出的第一个解决方案是“视图模型范例”,您可以在其中创建一个类,其唯一目的是成为视图模型以检索数据,然后将其映射到模型类。您可以使用AutoMapper映射值。这是关于如何应用此问题的article。
答案 1 :(得分:2)
您的第一种方法是不可能的。 EF不支持映射到同一个表的多个实体(除了一些特殊情况,如TPH继承或表拆分)。
第二种情况是常见情况。您将为UI创建视图模型,并将您的实体投影到查询中直接查看模型(它将仅从您投影的DB中传递)或者您将查询整个实体并转换为在应用程序代码中查看模型(例如, AutoMapper为@Fernando提到)。
如果您正在使用EDMX文件进行映射(我猜你不是因为你提到ef-code-first),你可以使用第三种方法,它参与了两种提到的方法。该方法定义QueryView - 它是映射实体的基于EF的视图,其表现为新的只读实体。通常,它是可重复使用的投影,直接存储在映射中。
答案 2 :(得分:1)
您可以创建一个接受对象实例的通用属性过滤器方法,并传入一个列名称的字符串数组,此方法将返回一个只包含所需列的动态对象。
答案 3 :(得分:1)
我认为这会为您的模型增加不必要的复杂性,以便根据相同的数据结构添加第二个实体。老实说,我没有看到单个实体更新\编辑\查看的问题。如果您坚持将访问权限分离为SomeEntity,则可以拥有数据库视图:即SomeEntityView,并基于创建一个单独的实体。