2011-01-07 24 views
0

我討厭這樣做,但我在這方面花了太多時間。以下是將c#方法轉換爲MethodBuilder的嘗試。結果應該是使用EFCodeFirst的EntityFramework OnModelCreating的重寫方法。MethodBuilder for Entity Framework導致「格式不正確」程序

這裏是C#中的方法(簡稱爲簡單起見型號名稱)

protected override void OnModelCreating(ModelBuilder modelBuilder) { 
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 
    modelBuilder.Entity<Form>().ToTable("Form<Name>"); 
    modelBuilder.Entity<FormAg>().ToTable("FormAg<Name>"); 
} 

下面是我目前使用的MethodBuilder:

private static MethodBuilder FormContextBuildMethodOnModelCreating(TypeBuilder type, string formId) { 
    System.Reflection.MethodAttributes methodAttributes = System.Reflection.MethodAttributes.Public | System.Reflection.MethodAttributes.Family | System.Reflection.MethodAttributes.Virtual | System.Reflection.MethodAttributes.HideBySig; 

    //method 
    MethodBuilder OnModelCreating = type.DefineMethod("OnModelCreating", methodAttributes); 

    //method calls 
    MethodInfo Conventions = typeof(ModelBuilder).GetMethod("get_Conventions", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null); 
    MethodInfo RemoveConventions = typeof(ConventionsConfiguration).GetMethod("Remove", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null); 

    MethodInfo Entity = typeof(ModelBuilder).GetMethod("Entity", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null); 
    MethodInfo ToTable1 = typeof(System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<>).MakeGenericType(typeof(Form)).GetMethod("ToTable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(String) }, null); 
    MethodInfo ToTable2 = typeof(System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<>).MakeGenericType(typeof(FormAg)).GetMethod("ToTable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(String) }, null); 

    OnModelCreating.SetReturnType(typeof(void)); 
    OnModelCreating.SetParameters(typeof(ModelBuilder)); 

    ParameterBuilder modelBuilder = OnModelCreating.DefineParameter(1, ParameterAttributes.None, "modelBuilder"); 
    ILGenerator Il = OnModelCreating.GetILGenerator(); 

    Il.Emit(OpCodes.Nop); 
    Il.Emit(OpCodes.Ldarg_1); 
    Il.Emit(OpCodes.Callvirt, Conventions); 
    Il.Emit(OpCodes.Callvirt, RemoveConventions); 
    Il.Emit(OpCodes.Nop); 
    Il.Emit(OpCodes.Ldarg_1); 
    Il.Emit(OpCodes.Callvirt, Entity); 
    Il.Emit(OpCodes.Ldstr, "Form" + formId); 
    Il.Emit(OpCodes.Callvirt, ToTable1); 
    Il.Emit(OpCodes.Nop); 
    Il.Emit(OpCodes.Ldarg_1); 
    Il.Emit(OpCodes.Callvirt, Entity); 
    Il.Emit(OpCodes.Ldstr, "FormAg" + formId); 
    Il.Emit(OpCodes.Callvirt, ToTable2); 
    Il.Emit(OpCodes.Nop); 
    Il.Emit(OpCodes.Ret); 

    return OnModelCreating; 
} 

操作碼被從上面的反射器IL收集C#代碼。對於我的生活,我無法弄清楚這裏有什麼問題。我已經將問題縮小到了這個方法,因爲所有其他屬性以及沒有正確構建的東西。我可以返回一個空體(Nop + Ret),它工作正常...

任何試圖使用所產生的類型導致以下錯誤: An attempt was made to load a program with an incorrect format.

任何幫助將不勝感激。

+0

只是一個小小的更新,我已經解決了這個問題,但我真的不喜歡我的方法。 :)我創建了另一個類,該類繼承自包含「OnModelCreating」的基類,並帶有一個傳入formId的新構造函數。但嚴重的是,這不是我想要的:) – Buildstarted 2011-01-07 22:24:41

回答

0

只是要回答這個問題關閉它。

我創建了另一個類,該類繼承自包含OnModelCreating的基類,並帶有一個傳入formId的新構造函數。

相關問題