Я пытаюсь создавать таблицы динамически, используя Entity Framework с подходом, основанным на коде. Я динамически создаю класс, используя пространство имен System.Reflection.Emit
. Я могу добавить атрибут [Table]
в класс, а также смог добавить атрибут [Key] в свойство int. Когда я пытаюсь создать таблицу, выдается исключение, что в классе не определен ключ.
Мои вопросы:
Обязательно ли иметь KeyAttribute
?
Что не так с моим кодом?
Я попытался отладить и попытаться найти атрибуты, связанные с этим свойством, и это показывает, что нет добавленных атрибутов, но у него есть пользовательский атрибут типа 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[] { });
}
}
}