无法使用代码优先的方法使用Entity Framework创建动态表

时间:2019-01-12 16:08:02

标签: c# entity-framework-6 ef-migrations

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

0 个答案:

没有答案