C# 如何在Asp.net Mvc 4实体框架中使用图像
在我的班级里,我有一个:C# 如何在Asp.net Mvc 4实体框架中使用图像,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,在我的班级里,我有一个: public virtual Foto FotosLugar { get; set; } 我有这样的定义: public class Foto { [Column(TypeName = "image")] public byte[] Binary { get; set; } } 在我的LugarController中,我尝试过: public ActionResult Create(Lugar lugar, HttpPostedFileBase F
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)
我试着做一些转换,但也没有成功
我想在类
Lugar
中存储图像
。我不确定这是否与EF有关。看来你还没到那里
您的意思是,您不能在控制器中的创建操作中接收文件,对吗
您至少有两种选择:
- 使用一个参数(HttpPostedFile/IEnumerable)执行一个操作,并分别从模型中获取图像
- 或者,您只需访问控制器中的任何位置,即可获得上载文件的集合,然后添加到Lugar类中。不需要额外的FotosLugar参数
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
}
由于字节包含在流
对象中,因此处理文件比处理普通数据要复杂一些。上面的代码从流中读取字节,以便将它们存储在EF实体类中
还有几个注意事项:在Foto
实体上也存储ContentLength
、ContentType
,可能还有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; }
}
通过这种方式,您可以单独查询字符串
&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);
当您使用与上面类似的映射时,数据库中的所有Foto
和FotoBinary
行将共享相同的主键(Id
)。只要知道其中一个的Id,就可以使用它来查询另一个的对应行(Owner
或Content
)
最后,我想至少不要把<代码>卢格<代码>实体传递到你的MVC动作中去。您可以创建一个ViewModel类,如
LugarViewModel
。然后该类可以有一个HttpPostedFileBase
属性。然后,您的控制器操作可以从viewmodel获取数据,并使用它填充Lugar
实体。好的,下面是我对它的看法:
- 您的基本实体类应具有与最初指定的相同的byte[]属性。没关系
- 定义一个viewmodel类,该类可以传递给视图,也可以发回控制器。这是应该具有HttpPostedFileBase类型属性的类。
- 下面是一个教程,可以在传统控制器上发布:()
- 和API控制器:()
- 将文件发送到控制器后,必须将流转换为字节数组(以便能够将其分配给将存储在SQL Server中的实体对象)。以下是Skeet大师关于如何做到这一点的精彩回答:
Create
?很抱歉,您的控制器代码不起作用。。。。。行var foto=newfoto{Binary=content};它说它没有二进制的定义,所以我尝试了Content=Content,但也没用。。。。。我尝试了很多改变,但都没有成功。。。我也试着先创建一个FotoBInary。。。。。我还在学习asp.NETMVC,如果你能帮助我,我将非常感激。。。。你已经帮了我很多忙,但现在我有点迷路了……明天我会一对一地深入了解这件事。。。我将看到如何解决这个问题。我将根据您最初问题中的示例类编写大量代码。如果您遇到编译器错误,请确保您有一个名为Binary
的Foto
类,就像您原来的问题一样。