我尝试阅读了有关复杂类型的 MSDN 文章,但它没有解释何时使用它。此外,在网络上也没有全面的关于复杂类型及其使用的解释。
我尝试阅读了有关复杂类型的 MSDN 文章,但它没有解释何时使用它。此外,在网络上也没有全面的关于复杂类型及其使用的解释。
您提供的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#实体(例如,在供应商
实体中可以有一个地址
,但它只会被映射为供应商
表中的一组列)。这使得易于处理复杂类型中的值。
缺点恰恰在于此:如果发生同一个地址
(或您使用的任何其他类型)可以在不同实体之间共享,则可能需要在数据库中多次重复复杂类型值。
选择使用复杂类型还是单独实体取决于您和您的设计。
以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
)的同一张表中,从而使其成为值对象。