Как уменьшить код при беглом API в OnModelCreating - PullRequest
0 голосов
/ 14 октября 2018

У меня есть несколько столбцов, которые не должны изменяться при любом будущем обновлении в таблице, поэтому я сделал свой свободный API в OnModelCreating следующим образом.

base.OnModelCreating(builder);

builder.Entity<UserSetting>()
              .Property(p => p.ID)
                .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;
builder.Entity<UserSetting>()
              .Property(p => p.CreatedOn)
                .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;
builder.Entity<UserSetting>()
              .Property(p => p.CreatedBy)
                .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;

У меня есть 40 таблиц в моем проектепоэтому я написал 120 строк в этом методе.

Вместо того, чтобы писать 120 строк, есть ли более простой способ добиться этого ??

Обновление: Вот моя базакласс, унаследованный всеми остальными классами.

public class Common
{        
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }        
    [DataType(DataType.DateTime)]
    public DateTime CreatedOn { get; set; } = System.DateTime.Now;
    public string CreatedBy { get; set; }       
    [DataType(DataType.DateTime)]
    public DateTime LastUpdatedOn { get; set; }  = System.DateTime.Now;        
    public string LastUpdatedBy { get; set; }
    public string Remarks { get; set; }
}

public class table1 : Common
{
    //Other Properties...
}

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Есть много способов сделать это, наиболее естественным является перемещение общего кода в ограниченный универсальный класс , реализующий IEntityTypeConfiguration<TEntity>.Затем выполните итерации типов сущностей модели, создайте экземпляр класса конфигурации с помощью отражения и вызовите метод ApplyConfiguration для ModelBuilder динамически (или с помощью отражения).

Например, класс конфигурации:

public class CommonEntityTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
    where TEntity : Common
{
    public void Configure(EntityTypeBuilder<TEntity> builder)
    {
        builder.Property(p => p.ID)
            .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;
        builder.Property(p => p.CreatedOn)
            .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;
        builder.Property(p => p.CreatedBy)
            .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;
    }
}

и вызов его изнутри OnModelCreating:

var entityTypes = modelBuilder.Model.GetEntityTypes()
    .Where(t => typeof(Common).IsAssignableFrom(t.ClrType));
foreach (var entityType in entityTypes)
{
    var configurationType = typeof(CommonEntityTypeConfiguration<>)
        .MakeGenericType(entityType.ClrType);
    modelBuilder.ApplyConfiguration(
        (dynamic)Activator.CreateInstance(configurationType));
}

Это позволяет вам свободно конфигурировать все аспекты базового класса, а не только AfterSaveBehavior некоторых свойств.

0 голосов
/ 14 октября 2018

Имея в виду DRY, я бы предложил вам создать свой собственный метод расширения, например:

public static class ExtensionMethod
{
    public static void InmutableCollumn<TEntity, TProperty>(this ModelBuilder modelBuilder, Expression<Func<TEntity, TProperty>> propertyExpression) where TEntity : class
    {

        modelBuilder.Entity<TEntity>()
          .Property(propertyExpression)
            .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;
    }
}

Тогда вы бы назвали его:

modelBuilder.InmutableCollumn<UserSetting, Guid>(p => p.Id);

Это сделало бы вашкод проще в обслуживании и немного менее повторяется.

Вы можете даже заставить метод получать список выражений, просто нужно найти способ справиться с типом свойства.Посмотрите на этот черновик:

    public static void InmutableCollumn<TEntity>(this ModelBuilder modelBuilder, params Expression<Func<TEntity, object>>[] propertiesExpression) where TEntity : class
    {
        foreach(var propertyExpression in propertiesExpression)
            modelBuilder.Entity<TEntity>()
                .Property(propertyExpression)
                .Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;
    }

Так что это будет выглядеть так:

modelBuilder.InmutableCollumn<UserSetting>(p => p.ID, p => p.CreatedOn);
...