0

在我的课堂Lugar上,我有这个:

public virtual Foto FotosLugar { get; set; }

我有这个定义:

public class Foto
{
    [Column(TypeName = "image")]
    public byte[] Binary { get; set; }
}

在我的 LugarController 中,我尝试过:

 public ActionResult Create(Lugar lugar, HttpPostedFileBase FotosLugar)

我试图进行一些转换,但它也没有工作......

我想Image在类内存储一个Lugar....

4

3 回答 3

1

尝试这个:

public ActionResult Create(Lugar lugar, HttpPostedFileBase fotosLugar)
{
    if (fotosLugar != null && fotosLugar.ContentLength > 0)
    {
        var contentLength = fotosLugar.ContentLength;
        var content = new byte[contentLength];
        fotosLugar.InputStream.Read(content, 0, contentLength);
        var foto = new Foto { Binary = content };
        lugar.FotosLugar = foto;
    }
    //... eventually return an ActionResult
}

文件比普通数据更难处理,因为字节包含在Stream对象中。上面的代码从流中读取字节,以便它们可以存储在您的 EF 实体类中。

ContentLength其他几点注意事项:将,ContentType和也存储FileName在您的Foto实体上可能不是一个坏主意。您可能还想考虑将此实体拆分为 2,以便您可以从原始二进制文件数据中分别查询出文件名、内容类型和内容长度。我们的网站有一个问题,我们只需要获取文件名,但查询速度很慢,因为我们将byte[]列存储在与文件名相同的表中,SQL 在我们需要的时候返回所有二进制数据是字符串文件名。最终使用类似于以下的模型解决:

public class Foto
{
    public int Id { get; set; }
    public int ContentLength { get; set; }
    public string FileName { get; set; }
    public string ContentType { get; set; }
    public virtual FotoBinary Content { get; set; }
}

public class FotoBinary
{
    public int Id { get; set; }
    public virtual Foto Owner { get; set; }
    public byte[] Value { get; set; }
}

这样,您可以单独查询string&int数据,并在需要时单独预先加载或延迟加载二进制数据。这是这两个实体之间关系的流畅映射:

// Foto entity
HasRequired(principal => principal.Content)
    .WithRequiredPrincipal(dependent => dependent.Owner)
    .WillCascadeOnDelete(true);

// FotoBinary entity
HasRequired(dependent => dependent.Owner)
    .WithRequiredDependent(principal => principal.Content)
    .WillCascadeOnDelete(true);

当您使用与上述类似的映射时,数据库中的所有行FotoFotoBinary行都将共享相同的主键 ( Id)。只要知道一个的Id,就可以用它来查询另一个(OwnerContent)的对应行。

最后,我至少会考虑不将Lugar实体传递到您的 MVC 操作中。您可以改为编写 ViewModel 类,例如LugarViewModel. 然后,该类可以具有与 Karthik 的答案类似HttpPostedFileBase的属性。然后,您的控制器操作可以从视图模型中获取数据并使用它来填充实体。Lugar

于 2013-02-19T13:09:56.127 回答
0

我不确定这与EF有什么关系。看起来你还没有到达那里。

您的意思是您无法在控制器的Create操作中接收文件,对吗?

你至少有两个选择:

  • 有一个带有一个参数的操作(HttpPostedFile/IEnumerable)并与模型分开获取图像
  • 或者您可以简单地访问控制器中的任何地方的Request.Files,您将获得上传文件的集合,然后稍后将其添加到您的Lugar类。不需要额外的FotosLugar参数
于 2013-02-19T12:57:13.573 回答
0

好的,这是我的看法:

于 2013-02-20T03:44:23.903 回答