예제 #1
0
        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);
                    }
                }
            }));
        }
예제 #2
0
        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);
                }
            }));
        }
예제 #3
0
        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);
                        }
                    }
                }
            }));
        }