System.Drawing.Image EntityType 'Image' не определен ключ. Определите ключ для этого EntityType - PullRequest
4 голосов
/ 07 мая 2011

Я использую EF Code First и Data Scaffolding и имею сущность, которая содержит свойство типа

public System.Drawing.Image Image { get; set; }

При инициализации контекста БД для создания БД я получаю следующие ошибки:

System.Data.Edm.EdmEntityType:: EntityType 'Image' не определен ключ.Определите ключ для этого EntityType.

System.Data.Edm.EdmEntitySet: EntityType: EntitySet. Изображения основаны на типе Image, для которого не определены ключи.обойти это?

Ответы [ 2 ]

9 голосов
/ 07 мая 2011

После ответа @Gats - вы не можете отобразить все классы в EF.EF понимает только базовые типы, и каждый сопоставленный класс должен распознаваться как сущность или сложный тип.Таким образом, ваш Impage должен быть определен как:

public byte[] Image { get; set; }

Отметив его как byte[] EF поймет, что он должен храниться как varbinary на сервере SQL.EF не поддерживает пользовательские типы или пользовательские инициализаторы, поэтому вы не можете сказать EF, что ваш Image должен быть чем-то еще.

Если вы хотите выставить Image как System.Drawing.Image, вы также можетечто-то вроде:

public System.Drawing.Image GetBitmap()
{
    using (var stream = new MemoryStream(Image))
    {
        return System.Drawing.Image.FromStream(stream);
    }
}
5 голосов
/ 07 мая 2011

Это связано с тем, что EF не может отследить недоступный ему класс (например, System.Drawing.Image), и он видит ваше свойство image как собственную сущность и ожидает информацию о сопоставлении для него (включая первичный ключ).

Если вы храните изображение в своей базе данных, вам лучше использовать двоичное свойство, а затем добавить фактическое свойство Image в качестве не отображаемого свойства только для чтения, которое преобразует двоичный файл в файл изображения.System.Drawing.Image - это НЕ тип данных, который может просто отображаться на SQL.

Когда вы сделали это и хотите предотвратить сопоставление свойства, используйте следующую аннотацию данных:

[NotMapped]
public .....
...