Я попытался прочитать статью msdn о сложных типах. Но это не объясняет, когда его использовать. Также нет исчерпывающего объяснения в Интернете по сложным типам и когда их использовать.
Что такое сложный тип в структуре сущности и когда его использовать?
Ответ 1
Длительное объяснение заключается в статье MSDN, которую вы связали... поэтому вы в основном хотите простое объяснение:
Комплексный тип - это набор свойств, которые существуют в его собственном объекте для С#, но сопоставляются с столбцами в уже существующей таблице (той, которая содержит сущность, которая ее содержит), вместо собственной таблицы (которая нужен ключ и т.д.).
Итак, представьте, что вы хотите эту таблицу в базе данных:
Orders
----------
Id (bigint)
Name (varchar)
Street (varchar)
Region (varchar)
Country (varchar)
Но хочу эту структуру в объектах С#:
class Order
{
long Id;
string Name;
struct Address
{
string Street;
string Region;
string Country;
}
}
Итак, Address
будет сложным типом: он не будет существовать сам по себе (в таблице не будет Addresses
) в базе данных... он будет существовать только как набор столбцов на Orders
.
Как отмечено @HenkHolterman в комментариях, значение наличия сложных типов имеет единственный объект С#, который может использоваться как значение для других содержащихся объектов (в моем примере вы могли бы иметь Address
в Supplier
, но он просто будет отображаться как набор столбцов в таблице Suppliers
). Это упрощает работу со значениями в сложном типе.
Недостаток заключается именно в том: вам может потребоваться многократно повторять значения сложного типа в базе данных, если происходит то, что один и тот же Address
(или любой другой тип, который вы используете) может быть разделен между разными объектами.
Если вы решите работать со сложными типами или отдельными сущностями, зависит от вас и вашего дизайна.
Ответ 2
Рассмотрим этот класс ContactDetails
, например:
public class ContactDetails
{
public string HomePhone { get; set; }
public string MobilePhone { get; set; }
public string FaxNumber { get; set; }
}
По умолчанию EF будет обрабатывать ContactDetails
как объект. Это означает, что если (например) у вас есть класс Person
с свойством navigation-property типа ContactDetails
, EF отобразит отношение Person.ContactDetails
к другой таблице (поскольку Entity - это то, что имеет идентификатор и, следовательно, другие объекты могут ссылаться на него - и это потребует другой таблицы в реляционных терминах).
Обозначая ContactDetails
как сложный тип вместо этого, EF больше не будет рассматривать его как объект, который требует отношения, и вместо этого сопоставляет его с той же таблицей родительского (содержащего) объекта (Person
в моем примере), что делает его Объектом значения.