Подтвердить что ты не робот

Что такое сложный тип в структуре сущности и когда его использовать?

Я попытался прочитать статью msdn о сложных типах. Но это не объясняет, когда его использовать. Также нет исчерпывающего объяснения в Интернете по сложным типам и когда их использовать.

4b9b3361

Ответ 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 в моем примере), что делает его Объектом значения.