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[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[] 可以为空?的主要内容,如果未能解决你的问题,请参考以下文章