什么是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
)的同一个表中,从而有效地使其成为值对象 。