Esempio n. 1
0
        public static ModelBuilder BuildIndex(
            this ModelBuilder builder,
            IModelStore modelStore,
            IIndexProvider?indexProvider = null)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (modelStore == null)
            {
                throw new ArgumentNullException(nameof(modelStore));
            }
            indexProvider ??= new DefaultIndexProvider();

            foreach (var type in modelStore.GetModels())
            {
                var indices = type.GetProperties()
                              .Select(p => new { Property = p, Attribute = p.GetCustomAttribute <IndexAttribute>(true) })
                              .Where(x => x.Attribute != null)
                              .Select(p => new
                {
                    IndexName = string.IsNullOrWhiteSpace(p.Attribute.IndexName)
                            ? null
                            : p.Attribute.IndexName,
                    PropertyName = p.Property.Name,
                    Order        = p.Attribute.Order,
                    Attribute    = p.Attribute
                })
                              .GroupBy(p => p.IndexName, NullUniqueEqualityComparer <string?> .Get());

                foreach (var index in indices)
                {
                    var attribute = index.First().Attribute;

                    var propertyNames = index.OrderBy(x => x.Order).Select(x => x.PropertyName).ToArray();
                    var indexBuilder  = builder.Entity(type)
                                        .HasIndex(propertyNames, attribute.IndexName)
                                        .IsUnique(attribute.IsUnique);

                    if (!string.IsNullOrEmpty(attribute.Method))
                    {
                        indexProvider.HasMethod(indexBuilder, attribute.Method);
                    }
                }
            }

            return(builder);
        }
Esempio n. 2
0
 // ctor.
 public CustomEfDbContext(IModelStore modelStore, [NotNull] DbContextOptions options) : base(options)
 {
     _modeTypes    = modelStore.GetModels();
     LoggerFactory = new LoggerFactory(new[] { DebugLoggerProvider });
 }