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

Moh*_*hah 30 c# asp.net entity-framework

我试图阅读有关复杂类型的msdn 文章.但它没有解释何时使用它.关于复杂类型以及何时使用它们的网络也没有全面的解释.

Jcl*_*Jcl 41

冗长的解释是在你链接的MSDN文章中...所以你基本上想要一个简单的解释:

复杂类型是一组属性,它们存在于C#的自己的对象中,但是映射到现有表(包含它的实体的表)上的列,而不是拥有自己的表(需要一个键)等).

所以想象你想在数据库上使用这个表:

Orders
----------
Id (bigint)
Name (varchar)
Street (varchar)
Region (varchar)
Country (varchar)
Run Code Online (Sandbox Code Playgroud)

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

class Order
{
   long Id;
   string Name;

   struct Address
   {
     string Street;
     string Region;
     string Country;
   }
}
Run Code Online (Sandbox Code Playgroud)

所以会有Address一个复杂的类型:它本身不存在(不存在Addresses表)数据库......它只会作为一组列存在于Orders表中.

正如@HenkHolterman在评论中所指出的,具有复杂类型的价值是拥有一个C#实体,可以将其用作其他包含实体的值(在我的示例中,您可以AddressSupplier实体中拥有一个,例如,但它将被映射为表中的一组列Suppliers).它使得处理复杂类型中的值变得容易.

缺点恰恰在于:如果碰巧Address在不同实体之间共享相同(或您使用的任何其他类型),则可能必须在数据库中多次重复复杂类型值.

无论您选择使用复杂类型还是单独的实体,都取决于您和您的设计.


hai*_*770 9

以此类ContactDetails为例:

public class ContactDetails
{
    public string HomePhone { get; set; }
    public string MobilePhone { get; set; }
    public string FaxNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

通过将其表示ContactDetails复杂类型,EF将不再将其视为需要关系的实体,而是将其映射到父(包含)实体的同一个表(Person在我的示例中),从而有效地使其成为值对象.