utilizzando EF 6.1+ ci sono stati momenti in cui è necessario aggiungere o rimuovere le conentioni esistenti. Il codice sembra più o meno come:
public class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.AddFromAssembly(Assembly.GetExecutingAssembly());
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
}
}
come si fa lo stesso nel core EF? Modelbuilder non ha proprietà Conventions :(
Sto portando un po 'di codice da EF a EF Core 2.1+ e non vedo l'ora di EF Core 3.0, quindi ho scritto alcuni metodi di estensione che aiutano un po' ..
public static IEnumerable<IMutableEntityType> EntityTypes(this ModelBuilder builder)
{
return builder.Model.GetEntityTypes();
}
public static IEnumerable<IMutableProperty> Properties(this ModelBuilder builder)
{
return builder.EntityTypes().SelectMany(entityType => entityType.GetProperties());
}
public static IEnumerable<IMutableProperty> Properties<T>(this ModelBuilder builder)
{
return builder.EntityTypes().SelectMany(entityType => entityType.GetProperties().Where(x => x.ClrType == typeof(T)));
}
public static void Configure(this IEnumerable<IMutableEntityType> entityTypes, Action<IMutableEntityType> convention)
{
foreach (var entityType in entityTypes)
{
convention(entityType);
}
}
public static void Configure(this IEnumerable<IMutableProperty> propertyTypes, Action<IMutableProperty> convention)
{
foreach (var propertyType in propertyTypes)
{
convention(propertyType);
}
}
con questi è possibile scrivere convenzioni simili a quelle in EF 6.1.x, ad esempio.
// equivalent of modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.EntityTypes()
.Configure(et => et.Relational().TableName = et.DisplayName());
// Put the table name on the primary key
modelBuilder.Properties()
.Where(x => x.Name == "Id")
.Configure(p => p.Relational().ColumnName = p.DeclaringEntityType.Name + "Id");
// Mark timestamp columns as concurrency tokens
modelBuilder.Properties()
.Where(x => x.Name == "Timestamp")
.Configure(p => p.IsConcurrencyToken = true);
Per EF Core 3.0 i metodi di metamodello sono leggermente cambiati, quindi è necessario
modelBuilder.EntityTypes()
.Configure(et => et.SetTableName(et.DisplayName()));
modelBuilder.Properties()
.Where(x => x.Name == "Id")
.Configure(p => p.SetColumnName(BaseName(p.DeclaringEntityType.Name) + "Id"));
Non ho verificato questo per l'efficienza, ma a meno che il tuo modello non sia enorme non dovrebbe costituire un problema
Questo può essere esteso con altri helper per chiavi esterne, indici ecc