Система.Рисунок.Тип объекта изображения ‘Image’ не имеет определенного ключа. Определите ключ для этого EntityType

#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 .....