2013-05-21 41 views
1

我先用EF代碼使用ASP.NET MVC。MVC模型如何使字節[]爲空?

在我的模型我有一個可以爲空的屬性:

public byte[] Avatar { get; set; } 

然而,當我運行更新的數據庫,我得到:

無法插入NULL值插入列「阿凡達」 ,表'temp'; 列不允許有空值。更新失敗。

我沒有dataannotation指定要求的屬性,屬性也不是外鍵。

任何想法?

進一步更新:

如果我刪除了數據庫,並迫使一個新的與「更新數據庫-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; } 
+0

你確定這是一個MVC問題嗎?就我所知,MVC並不直接處理表和列。 – Kobi

+0

實體框架問題,在包管理器控制檯中運行update-database時發生錯誤 – Evonet

+0

它是否必須是字節? 爲什麼不只是使用空值 KingCronus

回答

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

我認爲你需要告訴您正在使用它以這種方式EF。嘗試使用上面的圖像註釋。

這將確保您的字段創建爲圖像類型;爲此類場景設計。

編輯:請參閱評論爲最終奏效的答案。

+0

我已經嘗試過,但沒有運氣。我已經更新了我的問題並提供了進一步的發現 – Evonet

+0

@BartekMarnane - 您的字段是以什麼類型創建的,就像在SQL Management中查看它一樣? – KingCronus

+0

當我查看SQL管理工具時,數據類型是'圖像' – Evonet

0

嘗試解決這裏指出:What is the data annotation for changing nullable and not null data types?

即: 從byte[]將其更改爲byte?

乾杯

+1

可空字節不等於一個字節數組。 – ken2k

+0

正確,但據我所知,實體框架中的字節數組不能爲空。所以,就我所能看到的解決方案而言,解決方案是將其聲明爲可空字節,並手動處理數據庫。 (byte []在CLR中不是可以爲空的類型) – pwae

1

這不是直接的答案,而是有用的解決方法。當你創建實體,initalize頭像場:

public void CreateSomething(Something something) 
    { 

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

對於EF阿凡達所以現在一切正常不爲空。 希望,這將有所幫助。

+0

謝謝,這是有用的解決方法 – Evonet