EF7 использует Fluent для установки конфигурации свойств по умолчанию на основе типа и имени - PullRequest
0 голосов
/ 29 ноября 2018

В EF6 я смог определить свои свойства БД по умолчанию с помощью OnModel Create, имея следующее

//Strings In General unless otherwise specified in metadata are Varchar(50) Not Null
modelBuilder.Properties<string>().Where(p => p.Name != "CreatedByUsername" || p.Name != "LastEditByUsername" || p.Name != "DeletedByUsername").Configure(p => p.HasMaxLength(50).IsRequired());//Required and Length(50)
//Common Table Username Fields
modelBuilder.Properties<string>().Where(p => p.Name == "CreatedByUsername" || p.Name == "LastEditByUsername" || p.Name == "DeletedByUsername").Configure(p => p.IsOptional().HasMaxLength(128));
modelBuilder.Properties<string>().Where(p => p.Name.EndsWith("Email")).Configure(p => p.HasMaxLength(100));
modelBuilder.Properties<string>().Where(p => p.Name.EndsWith("Username")).Configure(p => p.HasMaxLength(128).IsRequired());
modelBuilder.Properties<string>().Where(p => p.Name.EndsWith("Description")).Configure(p => p.HasMaxLength(200).IsRequired());
modelBuilder.Properties<string>().Where(p => p.Name.EndsWith("Comment") || p.Name.EndsWith("Note")).Configure(p => p.HasMaxLength(250));
modelBuilder.Properties<string>().Where(p => p.Name.EndsWith("Note") || p.Name.EndsWith("Note")).Configure(p => p.HasMaxLength(250));
modelBuilder.Properties<string>().Where(p => p.Name.EndsWith("Code")).Configure(p => p.HasMaxLength(20).IsRequired());
//Date fields are date or datetime based on naming convention
modelBuilder.Properties<DateTime>().Where(p => p.Name.EndsWith("Date")).Configure(p => p.HasColumnType("DateTime2"));
modelBuilder.Properties<DateTime>().Where(p => p.Name.EndsWith("DateTime") || p.Name == "LastEditDateTime" || p.Name == "CreatedDateTime" || p.Name == "DeletedDateTime").Configure(p => p.HasColumnType("DateTime"));
//Optional Values for these date and times
modelBuilder.Properties<DateTime>().Where(p => p.Name == "LastEditDateTime" || p.Name == "DeletedDateTime").Configure(p => p.IsOptional());

, однако в ef7 не так легко сказать все строковые значения, которые соответствуют этим именамправила применяют конфиг.

   protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.ApplyConfiguration(new ApplicationUserMap());

        var strProperties = modelBuilder
            .Model
            .GetEntityTypes()
            .SelectMany(e => e.GetProperties())
            .Where(p => p.ClrType == typeof(string))
            .ToList();
        foreach (var property in modelBuilder.Model.GetEntityTypes()
            .SelectMany(t => t.GetProperties())
            .Where(prop => prop.ClrType == typeof(string)))
        {
            if (property.Name.EndsWith("Email"))
            {
              property.AsProperty().Builder.HasMaxLength(100,ConfigurationSource.Convention);
            }
            //.... Other if statements here
        }

Вопрос: есть ли лучший способ, чем повторять все сущности и свойства для применения, тогда более эффективно аналогично методу ef6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...