什么是实体框架上下文中的复杂类型

本文关键字:复杂 类型 上下文 实体 框架 什么 | 更新日期: 2023-09-27 18:33:39

现在我正在从 Pluralsight 上的视频中学到很多关于实体框架的知识,所以请原谅我的问题,它可能看起来很新手,但我无法理解复杂类型是什么或为什么我需要它们。

我知道我必须通过注释或Fluent Api来映射它们,如下所示:

modelBuilder.ComplexType<blubb>();

也许有人可以为我详细说明复杂类型的需求?

什么是实体框架上下文中的复杂类型

假设您在类中有一个课程实体,该实体具有位置、日期和时间的标量属性,但您发现您想要抽象化它,以便其他实体可以使用相同的模型。 因此,您可以创建一个包含"日期"、"位置"和"时间"的复杂类型,并为其命名:ComplexType1。 现在,其他实体只需在模型定义中声明 ComplexType1 即可使用此类型而不是单个标量属性。

复杂类型是数据库中重复的结构模式。 您必须自定义映射它们,因为无法推断它。

例如,两个表都具有与地址相关的列:

公司

CompanyName
AddressLine1
AddressLine2
Postcode

客户经理

Name
TelephoneNumber
SuperiorName
AddressLine1
AddressLine2
Postcode

这显然不是规范化的数据库设计,但这种情况确实会发生。 您可以将地址模型抽象为复杂类型,然后指定 Company 和 AccountManager 都具有该复杂类型,而不是为每个具有地址列的表映射匹配列(尽管在数据库中是分开的)。

以下是一篇关于复杂类型的深入文章:http://msdn.microsoft.com/en-gb/data/jj680147.aspx

这里有一个不太重的,它显示了在一个模型上映射两个地址的好处,比如:http://visualstudiomagazine.com/articles/2014/04/01/making-complex-types-useful.aspx

复杂类型是不映射到实体等表的类型,而是映射到一个或多个字段。

以下复杂类型

public class Descriptor
{
     public string Name {get;set;}
     public string Description {get;set;}
}

和实体

public class MyEntity
{
    public Descriptor { get;set;}
}

这将映射到具有NameDescription字段的表。这是一种有用的方法,可以让类型封装一组你可能想要的通用字段/属性在多个实体上。