В 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