4

我使用EF代碼第一次和數據腳手架和有一個包含類型的屬性的實體System.Drawing.Image EntityType'Image'沒有定義鍵。定義鍵此的EntityType

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

當initialsing數據庫上下文來創建數據庫,我收到以下錯誤:

System.Data.Edm.EdmEntityType :: EntityType'Image'沒有定義鍵。 定義此EntityType的關鍵。

System.Data.Edm.EdmEntitySet: 的EntityType:EntitySet的圖像是在不具有鍵 定義的類型基於圖像的 。

關於如何避免這種情況的任何想法?

回答

9

繼@Gats答案 - 你不能所有的類映射到EF。 EF只理解基本類型,每個映射類必須被識別爲實體或複雜類型。所以,你必須Impage被定義爲:

public byte[] Image { get; set; } 

通過將其標記爲byte[] EF會明白,它必須在SQL Server中存儲爲varbinary。 EF不支持自定義類型或自定義初始化程序,因此您不能說EF應該是其他任何東西。

如果要公開Image爲System.Drawing.Image對象,以及你可以這樣做:

public System.Drawing.Image GetBitmap() 
{ 
    using (var stream = new MemoryStream(Image)) 
    { 
     return System.Drawing.Image.FromStream(stream); 
    } 
} 
+0

+ @Gats感謝您的答覆。我當然會發現自己很重視我的POCO模型,以適應ORM。這是可憐的,沒有我可以在上下文類中聲明的自定義映射。 – Hugo 2011-05-09 10:21:22

5

這是因爲EF無法跟蹤無法使用的類(如System.Drawing.Image),並且它將「圖像」屬性視爲它自己的實體,並且期望它的映射信息(包括主鍵) 。

如果要在數據庫中存儲圖像,最好使用二進制屬性,然後將實際的圖像屬性添加爲只讀非映射屬性,將二進制文件轉換爲圖像文件。 System.Drawing.Image不是可以映射到SQL的數據類型。

當你做到這一點,並要防止財產被映射使用以下數據註釋:

[NotMapped] 
public .....