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