Avere questa interfaccia:
public interface INotPersistingProperties
{
string MyNotPersistingPropertyA { get; set; }
string MyNotPersistingPropertyB { get; set; }
}
e molte entità che implementano l'interfaccia
public class MyEntity : INotPersistingProperties
{
public int Id { get; set; }
public string MyNotPersistingPropertyA { get; set; }
public string MyNotPersistingPropertyB { get; set; }
}
c'è qualche possibilità di ignorare automaticamente, per tutte le entità che implementano le proprietà INotPersisting, quelle proprietà (usando l'API Fluent)?
Attualmente EF Core non fornisce un modo per definire le convenzioni personalizzate, ma è possibile aggiungere quanto segue alla propria sovrascrittura OnModelCreating
(dopo che tutti i tipi di entità vengono rilevati) per iterare tutti i tipi di entità che implementano l'interfaccia e chiamare Ignore
fluent API per ogni proprietà:
var propertyNames = typeof(INotPersistingProperties).GetProperties()
.Select(p => p.Name)
.ToList();
var entityTypes = modelBuilder.Model.GetEntityTypes()
.Where(t => typeof(INotPersistingProperties).IsAssignableFrom(t.ClrType));
foreach (var entityType in entityTypes)
{
var entityTypeBuilder = modelBuilder.Entity(entityType.ClrType);
foreach (var propertyName in propertyNames)
entityTypeBuilder.Ignore(propertyName);
}
Per ignorare tutte le classi di interfaccia specifica per EF Core ho usato questo codice:
protected override void OnModelCreating(ModelBuilder builder)
{
var multitenantTypes = typeof(IMultiTenantEntity)
.Assembly
.GetTypes()
.Where(x => typeof(IMultiTenantEntity).IsAssignableFrom(x))
.ToArray();
foreach (var typeToIgnore in multitenantTypes)
{
builder.Ignore(typeToIgnore);
}
}