2013-02-19 33 views
0

里面我Lugar类我有这样的:如何处理图像在Asp.net的mvc 4工作,实体框架

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

+0

如何调用'Create'? – 2013-02-19 12:30:00

回答

0

我不知道这有什么关系EF内。看起来你还没有到达那里。

你所说的是,你不能接收里面的一个文件创建控制器行动,对不对?

您至少有两种选择:

  • 有一个参数(HttpPostedFile/IEnumerable的),并从模型中分别获得图像
  • 或者你可以简单地访问Request.Files行动在你的控制器的任何地方,你会得到一个上传文件的集合,然后添加到你的Lugar类。有没有需要有额外的FotosLugar参数
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实体类中。

一对夫妇的其他注意事项:这也许不是一个坏主意,还存放了ContentLengthContentType,并在您Foto实体可能FileName。您可能还想考虑将此实体分解为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。然后该类可以有一个HttpPostedFileBase属性in similar fashion to Karthik's answer。然后,您的控制器操作可以从视图模型中获取数据并使用它来填充实体。

+0

对不起,但你的控制器代码不工作..... 行var foto = new Foto {Binary = content}; 它说它没有Binary的定义,所以我尝试了内容=内容,但没有工作,或者.....我尝试了很多更改,但没有任何工作......我试图先创建一个FotoBInary ..... 我还在学习asp.net MVC,如果你能帮助我,我会赞赏很多....你已经帮了很多,但现在我有点失落..... – 2013-02-20 00:49:14

+0

我会深入了解一下在这个一对一的明天... 我会看到如何解决这个问题 – 2013-02-20 03:51:00

+0

我基于很多关于原始问题中示例类的代码。如果您遇到编译器错误,请确保您的原始问题中包含名为'Binary'的属性的'Foto'类。 – danludwig 2013-02-20 12:34:45

0

OK,下面是它我采取:像您最初指定