Невозможно создавать динамические таблицы с использованием Entity Framework с подходом, основанным на коде - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь создавать таблицы динамически, используя Entity Framework с подходом, основанным на коде. Я динамически создаю класс, используя пространство имен System.Reflection.Emit. Я могу добавить атрибут [Table] в класс, а также смог добавить атрибут [Key] в свойство int. Когда я пытаюсь создать таблицу, выдается исключение, что в классе не определен ключ.

Мои вопросы:

  1. Обязательно ли иметь KeyAttribute?

  2. Что не так с моим кодом?

Я попытался отладить и попытаться найти атрибуты, связанные с этим свойством, и это показывает, что нет добавленных атрибутов, но у него есть пользовательский атрибут типа KeyAttribute.

У меня статически определенный класс с KeyAttribute, добавленным к одному из свойств. Когда я отлаживаю, KeyAttribute не было добавлено в коллекцию Attributes. Было там GetCustomAttributes()

Создайте класс, добавьте свойство int и добавьте KeyAttribute, используя System.Reflection.Emit:

public Type CreateClass(string className)
{
        Type returnValue = null;
        currentClassBuilder = currentModuleBuilder.DefineType(className, TypeAttributes.Public);
        AddTableAttributeToProperty(className);
        AddDefaultConstructor();
        FieldBuilder fieldBuilder = AddField("m_Number", typeof(Int32));
        PropertyBuilder propertyBuilder = AddProperty("Number", typeof(Int32));
        propertyBuilder.SetSetMethod(AddSetMethod(fieldBuilder, typeof(int)));
        propertyBuilder.SetGetMethod(AddSetMethod(fieldBuilder, typeof(int)));
        AddKeyAttributeToProperty(propertyBuilder);
        returnValue = currentClassBuilder.CreateType();
        return returnValue;
 }

В DbContext класс

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        var entityMethod = typeof(DbModelBuilder).GetMethod("Entity");

        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            var entityTypes = assembly
              .GetTypes()
              .Where(t =>
                t.GetCustomAttributes(typeof(TableAttribute), inherit: true)
                .Any());

            foreach (var type in entityTypes)
            {
                entityMethod.MakeGenericMethod(type)
                  .Invoke(modelBuilder, new object[] { });
            }
        }
}
...