Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Asp.net Mvc 4实体框架中使用图像_C#_Asp.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

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
类,就像您原来的问题一样。