3

如何爲DB代碼遷移創建所需的屬性(用於字段驗證)但爲Nullable?通過代碼優先的必需屬性,但可爲空的實體框架

我有一個數據庫表有一千個條目。最近需要添加必需的DateTime屬性。

[Required] 
    [Display(Name = "Birth", Order = 10)] 
    public DateTime? Birth { get; set; } 

如果我設置了[Required]註釋,則代碼第一次遷移將爲列聲明添加NOT NULL。但是,所有當前條目都沒有「出生」數據。它將是NULL。

Birth屬性應該被要求視圖字段validatoin,但它可以是可以爲空的數據庫。這有可能嗎?

我已經嘗試添加「?」 (可以爲空),並且「虛擬」沒有成功。

+2

如果你編輯數據,你不應該在視圖中使用數據模型 - 你應該使用視圖模型,'DateTime'可以用'[Required]'裝飾,但是從數據模型中省略。 –

回答

6

使用您的模型進行數據庫/實體通信。

爲您的UI層使用視圖模型。在ViewModel屬性中標記必需,在模型上標記Nullable。根據需要在代碼中執行強制轉換。將所有與UI相關的屬性修飾(如顯示,驗證/等)移動到ViewModel。

通過NuGet軟件包管理器,可以通過AutoMapper插件available自動執行鑄造。

1

一個快捷方式可能是重寫數據庫上下文的OnModelCreating()方法。

這樣:

public class AppContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 
     modelBuilder.Entity<YourModelEntity>.Property(p => p.Birth).IsOptional(); 
    } 

} 

或其他合適的方式是,你可以創建一個擴展類通用EntityTypeConfiguration類型,爲您的模型,然後這個特定的配置添加到()的DBModelBuilder在OnModelCreating方法本方法:

public class YourModelTypeConfiguration : EntityTypeConfiguration<YourModelType> 
{ 
    public YourModelTypeConfiguration() 
    { 
     // ... some other configurations ; 

     Property(p => p.Birth).IsOptional(); 
    } 
} 

請注意,您所需要的

using System.Data.Entity.ModelConfiguration; 

位於類文件的頂部。

然後在OnModelCreating()方法,你應該補充一點:你一直

public class AppContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // quick and dirty solution 
     // modelBuilder.Entity<YourModelEntity>.Property(p => p.Birth).IsOptional() 

     // cleaner solution 
     modelBuilder.Configurations.Add(new YourModelTypeConfiguration()); 
    } 

} 

這樣你的具體配置分離,沒有混合在一起的一切。

應用代碼首次遷移時,「出生」數據庫字段應爲空。

我希望這會有所幫助。

相關問題