3

Wie wird eine Eigenschaft (für die Feldüberprüfung) erforderlich, aber Nullable für die DB-Code-Migrationen?Erforderliche Eigenschaft aber Nullable, Entity Framework durch Code First

Ich habe eine DB-Tabelle mit tausend Einträgen. wurde kürzlich benötigt, um eine erforderliche DateTime-Eigenschaft hinzuzufügen.

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

Wenn ich [Required] Anmerkung gesetzt, der Kodex erste Migration wird NOT NULL in die Spalte Erklärung hinzuzufügen. Alle aktuellen Einträge haben jedoch keine Geburtsdaten. und es wird NULL sein.

Die Birth-Eigenschaft sollte für das View-Feld validato erforderlich sein, sie könnte jedoch in die DB nullbar sein. Ist das irgendwie möglich?

Ich habe bereits versucht hinzufügen "?" (Nullable) auf die Eigenschaft und "virtuell" ohne Erfolg.

+2

Wenn Sie Daten bearbeiten, sollten Sie kein Datenmodell in der Ansicht verwenden - Sie sollten ein Ansichtsmodell verwenden, und die 'DateTime' kann mit '[Erforderlich]' versehen, aber im Datenmodell weggelassen werden. –

Antwort

6

Verwenden Sie Ihr Modell für DB/Entity-Kommunikation.

Verwenden Sie ein Ansichtsmodell für Ihre UI-Ebene. Markieren Sie Erforderlich für die Eigenschaft im ViewModel und markieren Sie Nullable im Modell. Führen Sie die Umwandlung in Ihren Code nach Bedarf aus. Verschieben Sie alle UI-bezogenen Attributsdekorationen (wie Anzeige, Validierung/etc) ebenfalls auf das ViewModel.

Casting kann automatisch mit dem AutoMapper Plugin, available über den NuGet Paketmanager durchgeführt werden.

1

Ein schneller Weg könnte die OnModelCreating() - Methode Ihres DB-Kontext überschreiben.

Auf diese Weise:

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

} 

oder eine andere geeignete Art und Weise ist, dass Sie eine erweiterte Klasse des generischen EntityTypeConfiguration Typ für Ihr Modell und fügen Sie dann diese spezifische Konfiguration in die DBModelBuilder im OnModelCreating() -Methode können bei dieser übrigens:

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

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

Beachten Sie, dass die

using System.Data.Entity.ModelConfiguration; 
brauchen

oben in Ihrer Klassendatei.

Dann in der OnModelCreating() -Methode sollten Sie hinzufügen:

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()); 
    } 

} 

So können Sie Ihre spezifischen Konfigurationen getrennt halten und nicht alles zusammen mischen.

Bei der ersten Migration des Codes sollte das Datenbankfeld "Birth" nullfähig sein.

Ich hoffe, das hilft.