Skip to content

Instantly share code, notes, and snippets.

@vporton
Last active September 17, 2019 15:06
Show Gist options
  • Save vporton/3822ab42bee3894f5dd31de5aa9c065c to your computer and use it in GitHub Desktop.
Save vporton/3822ab42bee3894f5dd31de5aa9c065c to your computer and use it in GitHub Desktop.
        private static void ProcessTable(ModelBuilder modelBuilder, PropertyInfo contextMember)
        {
            Type tableType = contextMember.PropertyType.GetGenericArguments()[0];

            PropertyInfo[] members2 = tableType.GetProperties();

            foreach (var m in members2)
            {
                object[] attrs = m.GetCustomAttributes(typeof(KeyAttribute), true);
                if (attrs.Length < 1) continue; // FIXME: should be 2
                // Сейчас сделаем вызов вроде
                // modelBuilder.Entity<ShowTable>().HasKey(vf => new {vf.ID});
                MethodInfo mi = typeof(ModelBuilder).GetMethod("Entity", new Type[]{});
                MethodInfo miConstructed = mi.MakeGenericMethod(tableType);
                var entityTypeBuilder = /*(EntityTypeBuilder<[tableType]>)*/miConstructed.Invoke(modelBuilder, new object[]{});
                Type EntityTypeBuilderType = typeof(EntityTypeBuilder<>).MakeGenericType(new[]{tableType});
                MethodInfo mi2 = typeof(ModelBuilder).GetMethod("HasKey");

                var tableParam = Expression.Parameter(tableType, "table");
                IEnumerable<Expression> keys1 = 
                    from a in members2 select Expression.Property(tableParam, a.Name);

                System.Linq.Expressions.NewArrayExpression newArrayExpression =
                    System.Linq.Expressions.Expression.NewArrayInit(typeof(object), keys1);

                // (dynamic t) => keys;
                var myDelegate = Expression.Lambda<Func<dynamic, object>>(
                    newArrayExpression,
                    new ParameterExpression[] { tableParam });
                mi2.Invoke(entityTypeBuilder, new[]{myDelegate});
            }
        }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment