System.Drawing.Image EntityType'Image'没有定义键.定义此EntityType的键

Hug*_*ugo 4 mapping ado.net entity-framework system.drawing.imaging entity-framework-4.1

我正在使用EF Code First和Data Scaffolding,并且有一个包含类型属性的实体

public System.Drawing.Image Image { get; set; }
Run Code Online (Sandbox Code Playgroud)

初始化DB上下文以创建数据库时,我会收到以下错误:

System.Data.Edm.EdmEntityType :: EntityType'Image'没有定义键.定义此EntityType的键.

System.Data.Edm.EdmEntitySet:EntityType:EntitySet Images基于没有定义键的Image类型.

关于如何获得这个的任何想法?

Lad*_*nka 9

关注@Gats回答 - 您无法将所有类映射到EF.EF仅了解基本类型,并且每个映射类必须被识别为实体或复杂类型.所以你Impage必须定义为:

public byte[] Image { get; set; }
Run Code Online (Sandbox Code Playgroud)

通过将其标记为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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Gat*_*ats 5

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

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

完成此操作后,如果要阻止映射属性,请使用以下数据批注:

[NotMapped]
public .....
Run Code Online (Sandbox Code Playgroud)