In NHibernate avevano un elegante concetto di convenzione, dove si potrebbe dire che se un'entità aveva una proprietà Name
, ed era una stringa, si poteva applicare ad essa un certo comportamento di db (ad esempio, impostarla su null, max lunghezza x, forse unica se si potesse essere certi che tutti i nomi sarebbero unici).
Sarebbe una piccola classe, la aggiungerei alla tua fabbrica di istanze e bam! Il modello db si costruirà di conseguenza.
Esiste un meccanismo analogo in EF Core? Non riesco a trovarlo e il numero ridicolo di configurazioni fluide per ogni entità per ogni proprietà è piuttosto noioso.
In EF Core le convenzioni integrate vengono utilizzate per creare un modello iniziale, che è possibile sovrascrivere o modificare in OnModelCreating.
Puoi semplicemente scorrere le entità e le proprietà ignorare le convenzioni. Funziona abbastanza bene al posto delle convenzioni personalizzate di EF6 che (almeno finora) le convenzioni personalizzate non sono riuscite a fare un arretrato. Vedi https://github.com/aspnet/EntityFrameworkCore/issues/214 per lo stato e alcuni esempi. È anche un modello abbastanza comune leggere un attributo personalizzato in OnModelCreating per guidare (o sovrascrivere) la configurazione dell'entità.
Quindi il tuo esempio:
se un'entità aveva una proprietà Name ed era una stringa, è possibile applicare ad essa un determinato comportamento db (ad esempio, impostarlo su non null, lunghezza massima x, forse univoco se si fosse certi che tutti i nomi sarebbero univoci).
sarebbe qualcosa del tipo:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var props = from e in modelBuilder.Model.GetEntityTypes()
from p in e.GetProperties()
where p.Name == "Name"
&& p.PropertyInfo.PropertyType == typeof(string)
select p;
foreach (var p in props)
{
p.SetMaxLength(200);
p.IsNullable = false;
p.DeclaringEntityType.AddKey(p);
}
base.OnModelCreating(modelBuilder);
}
O se vuoi forzare i tipi di dati per tutte le colonne DataTime, qualcosa del tipo:
var dateProps = from e in modelBuilder.Model.GetEntityTypes()
from p in e.GetProperties()
where p.PropertyInfo.PropertyType == typeof(DateTime)
select p;
foreach (var prop in dateProps)
{
prop.Relational().ColumnType = "datetime2(4)";
}