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