#entity-framework #ado.net #mapping #entity-framework-4.1 #system.drawing.imaging
#entity-framework #ado.net #сопоставление #entity-framework-4.1 #system.drawing.imaging
Вопрос:
Сначала я использую EF Code и Data Scaffolding и у меня есть объект, который содержит свойство типа
public System.Drawing.Image Image { get; set; }
При инициализации контекста БД для создания БД я получаю следующие ошибки:
System.Data.Edm.EdmEntityType: : EntityType ‘Изображение’ не имеет определенного ключа. Определите ключ для этого EntityType.
System.Data.Edm.EdmEntitySet: EntityType: Набор объектов Images основан на типе Image, для которого не определены ключи.
Есть идеи о том, как обойти это?
Ответ №1:
Следуя ответу @Gats — вы не можете сопоставить все классы с EF. EF понимает только базовые типы, и каждый отображенный класс должен быть распознан либо как entity, либо как complex type. Поэтому ваш Impage
должен быть определен как:
public byte[] Image { get; set; }
Пометив его как byte[]
EF, вы поймете, что он должен храниться как varbinary
на SQL server. EF не поддерживает пользовательские типы или пользовательские инициализаторы, поэтому вы не можете сказать EF, что ваш Image
должен быть чем-то другим.
Если вы хотите представить Image
как System.Рисунок.Изображение также вы можете сделать что-то вроде:
public System.Drawing.Image GetBitmap()
{
using (var stream = new MemoryStream(Image))
{
return System.Drawing.Image.FromStream(stream);
}
}
Комментарии:
1. @Gats Спасибо за ваши ответы. Я, конечно, обнаружил, что немного изменяю свою модель POCO, чтобы приспособить ORM. Жаль, что нет пользовательского сопоставления, которое я мог бы объявить в классе context.
Ответ №2:
Это потому, что EF не может отслеживать класс, который ему недоступен (например, System.Рисунок.Изображение) и он видит ваше свойство «image» как свою собственную сущность и ожидает для него информацию о сопоставлении (включая первичный ключ).
Если вы храните изображение в своей базе данных, вам будет лучше использовать двоичное свойство, а затем добавить фактическое свойство изображения как свойство, доступное только для чтения, не отображаемое, которое преобразует двоичный файл в файл изображения. Система.Рисунок.Изображение — это не тип данных, который можно просто сопоставить с SQL.
Когда вы это сделаете и захотите предотвратить отображение свойства, используйте следующую аннотацию данных:
[NotMapped]
public .....