我正在尝试使用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[] { });
}
}
}