4

我正在使用 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 Images 基于没有定义键的 Image 类型。

关于如何解决这个问题的任何想法?

4

2 回答 2

10

在@Gats 回答之后 - 您不能将所有类都映射到 EF。EF 只理解基本类型,并且每个映射类必须被识别为实体或复杂类型。所以你Impage必须定义为:

public byte[] Image { get; set; }

通过将其标记为byte[]EF 将了解它必须像varbinary在 SQL Server 中一样存储。EF 不支持自定义类型或自定义初始化程序,因此您不能说 EF 您Image应该是其他任何东西。

如果您也想公开Image为 System.Drawing.Image ,您可以执行以下操作:

public System.Drawing.Image GetBitmap()
{
    using (var stream = new MemoryStream(Image))
    {
        return System.Drawing.Image.FromStream(stream);
    }
}
于 2011-05-07T11:32:40.463 回答
5

这是因为 EF 无法跟踪对其不可用的类(如 System.Drawing.Image),并且它将您的“图像”属性视为它自己的实体,并期望它的映射信息(包括主键)。

如果您在数据库中存储图像,最好使用二进制属性,然后将实际的 Image 属性添加为只读非映射属性,将二进制文件转换为图像文件。System.Drawing.Image 不是只能映射到 SQL 的数据类型。

当您完成此操作并希望防止属性被映射时,请使用以下数据注释:

[NotMapped]
public .....
于 2011-05-07T11:18:11.573 回答