MVC 模型如何使 byte[] 可以为空?

Posted

技术标签:

【中文标题】MVC 模型如何使 byte[] 可以为空?【英文标题】:MVC Model How to make byte[] nullable? 【发布时间】:2013-05-21 11:22:01 【问题描述】:

我首先使用带有 EF 代码的 ASP.NET MVC。

在我的模型中,我有一个可以为空的属性:

    public byte[] Avatar  get; set; 

但是,当我运行 update-database 时,我得到:

无法将值 NULL 插入到列 'Avatar'、表 'temp' 中; 列不允许空值。更新失败。

我没有指定所需属性的数据注释,该属性也不是外键。

有什么想法吗?

进一步更新:

如果我删除我的数据库并使用“update-database -verbose”强制创建一个新数据库,那么我可以看到正在创建的表专门在我的字段上强制使用 NOT NULL 标志:

CREATE TABLE [dbo].[UserProfile] (
    [UserId] [int] NOT NULL IDENTITY,
    [UserName] [nvarchar](max),
    [FirstName] [nvarchar](50) NOT NULL,
    [LastName] [nvarchar](50) NOT NULL,
    [EmailAddress] [nvarchar](50) NOT NULL,
    [WorkPhone] [nvarchar](20),
    [MobilePhone] [nvarchar](20),
    [HireDate] [datetime],
    [Avatar] [image] NOT NULL,
    [AvatarMimeType] [nvarchar](max),
    CONSTRAINT [PK_dbo.UserProfile] PRIMARY KEY ([UserId])
)

我的完整模型:

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId  get; set; 
    public string UserName  get; set; 

    [Required]
    [Display(Name = "First name")]
    [MaxLength(50, ErrorMessage = "First Name cannot be longer than 50 characters.")]
    public string FirstName  get; set; 

    [Required]
    [Display(Name = "Last Name")]
    [MaxLength(50, ErrorMessage = "Last Name cannot be longer than 50 characters.")]
    public string LastName  get; set; 

    [Display(Name = "Full Name")]
    public string FullName
    
        get
        
            return FirstName + " " + LastName;
        
    

    [Required]
    [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9]+(\\.[a-z0-9]+)*\\.([a-z]2,4)$", ErrorMessage = "Not a valid email address")]
    [Display(Name = "Email Address")]
    [MaxLength(50, ErrorMessage = "Email Address cannot be longer than 50 characters.")]
    public string EmailAddress  get; set; 

    [Display(Name = "Work Phone")]
    [MaxLength(20, ErrorMessage = "Work Phone cannot be longer than 20 characters.")]
    public string WorkPhone  get; set; 

    [Display(Name = "Mobile Phone")]
    [MaxLength(20, ErrorMessage = "Mobile Phone cannot be longer than 20 characters.")]
    public string MobilePhone  get; set; 

    [Display(Name = "Hire Date")]
    [DataType(DataType.Date), DisplayFormat(DataFormatString = "0:dd/MM/yyyy", ApplyFormatInEditMode = true)]
    public DateTime? HireDate  get; set; 

    [ValidateFile(ErrorMessage = "Please select a PNG, JPG or GIF image smaller than 2MB")]
    [Column(TypeName = "image")]
    public byte[] Avatar  get; set; 

    public string AvatarMimeType  get; set; 

【问题讨论】:

您确定这是 MVC 问题吗?据我所知,MVC 并不直接处理表和列。 一个实体框架问题,在包管理器控制台运行update-database时出错 必须是字节吗?为什么不直接使用 Nullable 为什么你确定你的属性“可以为空”? @KingCronus - 该属性用于在数据库中存储图像,我可以用 smallint 做同样的事情吗? 【参考方案1】:
[Column(TypeName = "image")]
public byte[] Avatar  get; set; 

我认为您需要告诉 EF 您正在以这种方式使用它。尝试使用上面的图像注释。

这将确保您的字段被创建为图像类型;专为此类场景设计。

编辑:请参阅 cmets 以获得最终有效的答案。

【讨论】:

我试过了,但没有运气。我已经用进一步的发现更新了我的问题 @BartekMarnane - 如果您在 SQL 管理中查看,您的字段会创建什么类型? 完美,***.com/a/11762360/614165 中的答案是有效的【参考方案2】:

这可能不是直接的答案,而是有用的解决方法。创建实体时,初始化头像字段:

    public void CreateSomething(Something something)
    

       something.Avatar= new byte[0],   
       Db.Somethings.Add(something);
       Db.SaveChanges();
    

对于 EF Avatar 现在不为空,所以一切正常。 希望对您有所帮助。

【讨论】:

【参考方案3】:

将其从 byte[] 更改为 byte?[]

【讨论】:

【参考方案4】:

尝试此处提到的解决方案:What is the data annotation for changing nullable and not null data types?

IE: 将其从byte[] 更改为byte?

干杯

【讨论】:

可空字节与字节数组不同。 正确,但据我所知,实体框架中的字节数组不能为空。因此,据我所知,解决方案是将其声明为可空字节,并手动处理数据库。 (byte[] 在 CLR 中不是可以为空的类型)

以上是关于MVC 模型如何使 byte[] 可以为空?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MVC 中使文本框可选

mvc 4 模型为空

如何使模型 id 在 asp mvc 中可插入和可编辑?

在 MVC 5 模型中提交表单在控制器发布方法中为空 [重复]

模型在按钮单击 ASP.NET MVC 5 时为空

带有模型的 mvc 上传文件 - 第二个参数发布的文件为空