public static ModelBuilder WithExtendedAttributes(this ModelBuilder builder) { return(builder.ApplyAction(type => { //composite keys var keys = (from it in type.ClrType.GetProperties() where it.GetCustomAttribute <CompositeKeyAttribute>() != null orderby it.GetCustomAttribute <ColumnAttribute>()?.Order ?? 0 select it.Name).ToArray(); if (keys.Length > 1) { builder.Entity(type.ClrType).HasKey(keys); } //indexes var indexes = from it in type.ClrType.GetProperties() from index in it.GetCustomAttributes <IndexAttribute>() orderby index.Name, index.Order group new { it.Name, index } by index.Name ?? Guid.NewGuid().ToString(); foreach (var index in indexes) { var indexBuilder = builder.Entity(type.ClrType).HasIndex(index.Select(it => it.Name).ToArray()); var first = index.First(); if (first.index.Name != null) { indexBuilder = indexBuilder.HasName(first.Name); } if (first.index.IsUnique) { indexBuilder.IsUnique(); } } //on delete foreach (var foreignKey in type.GetForeignKeys()) { if (foreignKey.DeclaringEntityType != type) { continue; } var onDelete = foreignKey.DependentToPrincipal?.PropertyInfo?.GetCustomAttribute <OnDeleteAttribute>(); if (onDelete != null) { foreignKey.DeleteBehavior = onDelete.Behavior; } } foreach (var property in type.GetProperties()) { //default value var defaultValue = property.PropertyInfo?.GetCustomAttribute <DefaultValueAttribute>(); if (defaultValue != null) { property.SetDefaultValue(defaultValue.Value); } } })); }
private static ModelBuilder ApplyActionEachProperty(this ModelBuilder builder, Action <IMutableEntityType, PropertyInfo> action) { return(builder.ApplyAction(type => { foreach (var property in type.ClrType.GetProperties()) { if (property.GetCustomAttribute <NotMappedAttribute>() != null) { continue; } action(type, property); } })); }
public static ModelBuilder AddNavigationConventions(this ModelBuilder builder, params string[] conventions) { return(builder.ApplyAction(type => { var keys = type.FindPrimaryKey()?.Properties .Select(it => it.Name) .ToList(); if (keys == null || keys.Count == 0) { return; } if (keys.Count == 1 && string.Equals(keys[0], "id", StringComparison.OrdinalIgnoreCase)) { return; } foreach (var nav in type.GetNavigations()) { var fk = nav.ForeignKey; if (fk.PrincipalEntityType != type || fk.PrincipalToDependent == null) { continue; } if (fk.Properties.Any(it => it.PropertyInfo != null)) { continue; } bool addedFk = false; var navigationPropertyName = fk.DependentToPrincipal?.PropertyInfo.Name ?? "[navigationPropertyName]"; foreach (var convention in conventions) { if (addedFk) { break; } var fks = keys .Select(key => convention.Replace("[principalEntityName]", type.ClrType.Name) .Replace("[principalPropertyName]", key) .Replace("[navigationPropertyName]", navigationPropertyName)) .ToArray(); if (fks.Except(fk.DeclaringEntityType.GetProperties().Select(it => it.Name)).Any()) { continue; } if (fk.PrincipalToDependent.IsCollection()) { addedFk = true; builder.Entity(type.ClrType).HasMany(fk.PrincipalToDependent.Name) .WithOne() .HasForeignKey(fks); } else { builder.Entity(type.ClrType).HasOne(fk.PrincipalToDependent.Name) .WithOne() .HasForeignKey(fk.DeclaringEntityType.Name, fks); } } } })); }