Свойство коллекции ComplexType в EF 4.1 с Code First

Можно ли создать свойство в POCO, которое представляет собой набор сложных типов?

[ComplexType]
public class Attachment
{        
    public string FileName { get; set; }

    public byte[] RawData { get; set; }

    public string MimeType { get; set; }
}

public class TestObject
{
    public TestObject()
    {
        Attachments = new List<Attachment>();
    }

    public virtual ICollection<Attachment> Attachments { get; set; }
}

У меня такое чувство, что это невозможно... Я делал все возможное, чтобы исследовать это, и мне кажется, что сложные типы доставляют больше проблем, чем пользы, по нескольким причинам.


person DMC    schedule 25.08.2011    source источник


Ответы (2)


Ваше ощущение правильное: это невозможно. Назначение сложного типа — встроить его свойства в виде столбцов в таблицу родительского типа. Как можно встроить динамическую коллекцию в строку таблицы и что вы ожидаете от коллекции сложных типов с точки зрения того, как она хранится?

На самом деле вам нужно обычное свойство навигации (в основном атрибут [ComplexType] необходимо удалить). По моему мнению, ваши отношения между TestObject и Attachment аналогичны отношениям между Order и OrderItem: OrderItem однозначно ссылается на один Order (у него есть один внешний ключ, который указывает на порядок), и, возможно, включено каскадное удаление, которое гарантирует, что элементы удаляются вместе с их порядком, что подчеркивает зависимость предметов от порядка. Чего еще и особенного вы хотите добиться, сделав OrderItems/Attachments сложным типом?

person Slauma    schedule 25.08.2011
comment
Я пытался использовать ComplexType, потому что вложения, на мой взгляд, очень похожи на другие примеры, которые я видел с ComplexTypes (имена, адреса и т. д.). Я подумал, что имеет смысл объявить этот тип один раз и повторно использовать его несколько раз. . Я думаю, что оставлю это, но просто оберну ComplexType в другой POCO, где мне нужно. Спасибо. - person DMC; 26.08.2011

Это невозможно, но не из-за концептуального несоответствия, как сказал Слаума, а потому, что EF этого не реализует. Посмотрите этот ответ для получения более подробной информации о поддержке коллекций, среди прочего.

Тем не менее, вероятно, лучше сделать его сущностью. Вам не нужно оборачивать его: у вас может быть базовый тип Attachment, который не отображается, а затем определенные подтипы, которые есть.

person Diego Mijelshon    schedule 25.08.2011
comment
Интересный! Знаете ли вы, как NH реализует коллекцию сложных типов на уровне хранилища? Я мог бы изобразить что-то вроде скрытой таблицы (не соответствующей объекту в модели, похожей на таблицу соединений «многие ко многим» в EF) и внутренне управляемой инфраструктурой ORM. И каждый раз, когда загружается родительский объект, коллекция также извлекается путем соединения с базой данных. Это так или похоже? - person Slauma; 26.08.2011
comment
@Slauma: сложный тип ничем не отличается от скалярного типа. Для набора целых чисел у вас будет таблица с двумя столбцами: значение и FK для родителя. Для вложения у вас будет FK плюс другие 3 столбца. Отношения всегда «один ко многим», а не «многие ко многим», потому что сложные типы не существуют сами по себе. Загрузка может быть нетерпеливой или ленивой, как и любая другая коллекция. - person Diego Mijelshon; 26.08.2011