Ich hasse es, aber ich habe viel zu viel Zeit damit verbracht. Das folgende ist ein Versuch, die C# -Methode in einen MethodBuilder zu konvertieren. Das Ergebnis sollte die Überschreibungsmethode für das EntityFramework OnModelCreating mit EFCodeFirst sein. HierMethodBuilder für Entity Framework führt zu "inkorrektem Format" -Programm
ist die Methode in C# (Modellnamen der Einfachheit halber abgekürzt)
protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
modelBuilder.Entity<Form>().ToTable("Form<Name>");
modelBuilder.Entity<FormAg>().ToTable("FormAg<Name>");
}
Hier ist die Method ich zur Zeit mit:
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;
}
Die OpCodes von Reflektor il der oben aufgelesen wurden C# -Code. Für das Leben von mir kann ich nicht herausfinden, was hier falsch ist. Ich habe das Problem auf diese Methode beschränkt, da alle anderen Eigenschaften und was nicht korrekt erstellt wird. Ich kann einen leeren Körper zurückkehren (Nop
+ Ret
) und es funktioniert gut ...
Jeder Versuch, die resultierende Art zu verwenden, wird folgende Fehlerursachen: An attempt was made to load a program with an incorrect format.
Jede Hilfe wäre sehr geschätzt.
Nur ein kleines Update, habe ich um dieses Problem gearbeitet, aber ich mag meine Methoden wirklich nicht. :) Ich habe eine andere Klasse erstellt, die von der Basisklasse, die das 'OnModelCreating' enthält, mit einem neuen Konstruktor erbt, der die FormId übergibt. Aber im Ernst, es ist nicht das, was ich überhaupt wollte :) – Buildstarted