Entity Framework 7 API fluente non riconosce IsOptional ()

ef-fluent-api entity-framework entity-framework-core

Domanda

Attualmente sto configurando il mio database nel mio progetto Asp.Net 5 usando entity framework 7, precedentemente con EF 6, quando volevo rendere alcune delle mie colonne nullable, vorrei usare:

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();

Ma sembra che IsOptional non faccia più parte di EF7, mi stavo chiedendo come posso ottenere la stessa cosa usando EF7?

Edit: la risposta di Marc è davvero corretta, prima di tutto ho funzionato perché ho trovato qualcosa che era come IsOptional :

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();

Ma dopo aver eseguito alcuni test senza di essa, ha impostato la colonna del database nullable perché l'ho contrassegnata come nullable nel mio modello di dominio:

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();

Vale anche la pena notare che quando ho reso il valore DateTime non annullabile e IsRequired(false) utilizzato IsRequired(false) , ho ricevuto il seguente errore:

La proprietà 'ArticleDateModified' sul tipo di entità 'Article' non può essere contrassegnata come nullable / facoltativo perché il tipo di proprietà è 'DateTime' che non è un tipo nullable. Qualsiasi proprietà può essere contrassegnata come non nullable / richiesta, ma solo le proprietà dei tipi nullable e che non fanno parte della chiave primaria possono essere contrassegnate come annullabili / facoltative.

quindi, mi chiedo quale sia l'uso di IsRequired(false) qui se tutto ciò che devo fare per rendere nullable una colonna del database è renderlo nullable nella mia classe di dominio?

Risposta accettata

Sulla base della nota in questa pagina di documentazione , sembrerebbe che il supporto per fare questo in modo dichiarativo sia stato annullato. A titolo di:

Una proprietà il cui tipo CLR non può contenere null non può essere configurata come facoltativa. La proprietà sarà sempre considerata richiesta da Entity Framework.

Che questo è stato intenzionale può essere visto nelle discussioni di progettazione dal progetto di hosting su GitHub, in particolare :

Cioè, una proprietà contrassegnata come nullable supporta valori nulli, mentre una proprietà contrassegnata come non nullable non deve mai contenere valori nulli. Ne consegue che contrassegnare una proprietà che è di tipo CLR non annullabile come consentire i valori nulli non sarà consentita. Questo è diverso dal comportamento di EF6 dove questo è permesso. [enfasi aggiunta]


Il risultato è, in EF7, una colonna NULL implica rigorosamente una proprietà mappata nullable. Se la proprietà è nullable, la colonna associata deve essere NULL meno che non la contrassegnali o la configuri con IsRequired .


Risposta alle modifiche OP

È interessante, inizialmente non ho visto la documentazione su IsRequired(bool) . Ho trovato un punto di discussione su di esso in alcune note di giugno che affermano che questo sarebbe l'equivalente di IsOptional() di IsOptional() :

.IsOptional () - Forniremo questa funzionalità tramite la chiamata Required (false)
.IsRequired () - Fornire Required () con la stessa funzionalità

Anche se questo era l'intento originale, la decisione di progetto di rescindere le date di supporto da ottobre. (Per aggiornamento) il tentativo di impostare IsRequired(false) su una proprietà non nullable genera un errore in fase di esecuzione piuttosto che essere stato rimosso completamente.

Sebbene ora superflua, l'API non può essere rimossa senza rompere il codice valido: non è stata implementata con IsRequired(bool) e IsRequired() , ma con un singolo IsRequired(bool required = true) . Se fosse rimosso e sostituito con la versione senza parametri, sarebbe un cambio di rottura.


Risposta popolare

Em ... dichiara la proprietà come nullable?

class Article
{
    public DateTime? ArticleDateModified {get;set;}
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché