什么是entity framework中的复杂类型以及何时使用它?

我试图阅读有关复杂类型的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; } } 

因此, Address将是一个复杂的类型:它不会自己存在(在数据库上没有Addresses表)…它只会作为Orders表上的一组列存在。

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

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

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

考虑这个ContactDetails类,例如:

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

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

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