1

我首先使用带有 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; }
4

4 回答 4

2
[Column(TypeName = "image")]
public byte[] Avatar { get; set; }

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

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

编辑:请参阅最终有效答案的评论。

于 2013-05-21T12:18:30.493 回答
1

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

    public void CreateSomething(Something something)
    {

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

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

于 2013-05-21T12:45:10.783 回答
1

将其更改byte[]byte?[]

于 2020-09-26T11:10:32.940 回答
0

试试这里提到的解决方案:什么是用于更改可空和非空数据类型的数据注释?

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

干杯

于 2013-05-21T11:46:20.460 回答