3

我处于将图像作为字节数组存储在 SQL 数据库中的情况。我正在使用 EF,因此我的模型中有一个字节数组自动属性,然后首先通过代码将其提交到数据库。

我想将一个只读属性(即 Image)放入我的模型中,并在调用 get 访问器时将字节数组转换为 Image。两个问题:

  1. 我应该使用什么样的图像?它应该是 System.Drawing 图像还是更新的 BitmapImage?
  2. 这会在代码优先和 EF 方面引起任何问题吗?

如果您愿意,我可以发布代码,但我认为没有必要,如果有人想查看我的代码,请发表评论。

4

1 回答 1

2

1)我应该使用什么样的图像?它应该是 System.Drawing 图像还是更新的 BitmapImage?

他们都没有。您应该使用字节数组 ( byte[])。

2) 这会导致代码优先和 EF 方面的任何问题吗?

我不这么认为。我不是 EF 专家,但我认为应该可以将byte[]属性映射到数据库中的相应varbinary(max)列。

现在回到关于在视图模型上显示图像和拥有属性的原始问题。即使您这样做,您也无法将此字节数组属性显示为视图内的图像,除非您使用data uri scheme并非所有浏览器都广泛支持的。如果您决定走这条路,这可能会是这样的:

@model MyViewModel
...
<img src="data:image/png;base64,@Html.Raw(Convert.ToBase64String(Model.Image))" alt="some image">

但是,如果您正在寻找一种可以在所有浏览器上运行的解决方案作为替代方案,您可以设计一个控制器操作,该操作将从数据库中获取您的图像作为字节数组,然后将其流式传输到响应中。<img>接下来,从您的角度来看,您可以在标签内引用此操作。

举个例子:

public ActionResult Image(int id)
{
    byte[] imageData = ... go query your database to retrieve the corresponding
                           image record using the id
    return File(imageData, "image/png");
}

然后在您的主视图中只需将<img>标签指向此控制器操作:

@model MyViewModel
...
<img src="@Url.Action("Image", "SomeController", new { id = Model.Id })">
于 2013-02-03T17:53:10.550 回答