什么是实体框架中的复杂类型,以及何时使用它?

43

我尝试阅读了有关复杂类型的 MSDN 文章,但它没有解释何时使用它。此外,在网络上也没有全面的关于复杂类型及其使用的解释。


2
以下提供了更多细节,虽然并没有直接回答你的问题 - EF Code First中的关联:第2部分 - 复杂类型 - Ivan Stoev
谢谢,我会调查一下。 - Mohit Shah
2个回答

56

您提供的MSDN文章中有详细的解释,如果您只想要简单的解释:

复杂类型是一组属性,在C#中存在于自己的对象中,但被映射到已经存在的表格的列(包含它的实体表格),而不是拥有自己的表格(那样需要一个键等)。

因此,可以将其想象为您希望在数据库中使用此表格:

Orders
----------
Id (bigint)
Name (varchar)
Street (varchar)
Region (varchar)
Country (varchar)

但是希望在C#实体中使用这个结构:

class Order
{
   long Id;
   string Name;

   struct Address
   {
     string Street;
     string Region;
     string Country;
   }
}

因此,地址将成为一种复杂类型:它不会独立存在(数据库中不会有地址表),而只会作为订单表上的一组列存在。

正如@HenkHolterman在评论中指出的那样,使用复杂类型的价值在于拥有一个可以用作其他包含实体的值的单个C#实体(例如,在供应商实体中可以有一个地址,但它只会被映射为供应商表中的一组列)。这使得易于处理复杂类型中的值。

缺点恰恰在于此:如果发生同一个地址(或您使用的任何其他类型)可以在不同实体之间共享,则可能需要在数据库中多次重复复杂类型值。

选择使用复杂类型还是单独实体取决于您和您的设计。


17

ContactDetails类为例:

public class ContactDetails
{
    public string HomePhone { get; set; }
    public string MobilePhone { get; set; }
    public string FaxNumber { get; set; }
}

默认情况下,EF会将ContactDetails视为一个实体(Entity)。这意味着,如果(例如)你有一个带有导航属性为ContactDetails类型的Person类,EF将把Person.ContactDetails关系映射到另一个表中(因为实体是具有自己身份的东西,因此其他实体可能会引用它 - 这在关系术语中需要一个不同的表)。

通过将ContactDetails标记为Complex Type,EF将不再将其视为需要关系的实体,而是将其映射到父实体(我的示例中的Person)的同一张表中,从而使其成为值对象


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接