public PolymorphicTypeBuilder <T> Add <T>() { var polymorphicTypeBuilder = new PolymorphicTypeBuilder <T>(); TypeBuilders.Add(polymorphicTypeBuilder); return(polymorphicTypeBuilder); }
private FormElement Build(IFormProperty property, Func <string, object> deserializer) { var element = Build(property, deserializer, PropertyBuilders); if (element == null && TypeBuilders.TryGetValue(property.PropertyType, out var builders)) { element = Build(property, deserializer, builders); } return(element); }
/// <summary> /// 映射物理表 /// </summary> /// <param name="absTable">抽象表类型</param> /// <param name="targetTableName">目标物理表名</param> /// <param name="targetTableName">所在层集如 "TM.Entity"</param> /// <returns></returns> public static Type MapTable(Type absTable, string targetTableName, string assemblyName) { var config = TypeBuilders.GetConfig(absTable); //实体必须放到Entity层中,不然会出现莫名调试BUG,原因未知 config.AssemblyName = assemblyName; config.Attributes.RemoveAll(x => x.Attribute == typeof(TableAttribute)); config.FullName = $"{assemblyName}.{targetTableName}"; return(TypeBuilders.BuildType(config)); }
public Type CreateContextType(List <Table> tables) { Type PocoType; TypeBuilder PocoTypeBuilder; //TypeBuilder ClassTypeBuilder; Types.Clear(); TypeBuilders.Clear(); //Context ContextTypeBuilder = DynamicTypeBuilder.GetTypeBuilder("Context", typeof(DbContextBase)); //Context Constructor System.Reflection.Emit.ConstructorBuilder constructor = ContextTypeBuilder.DefineDefaultConstructor(System.Reflection.MethodAttributes.Public | System.Reflection.MethodAttributes.SpecialName | System.Reflection.MethodAttributes.RTSpecialName); //Create Normal Poco Type to be used as a reference foreach (Table table in tables) { TypeBuilders.Add(table.VariableName, CreatePocoTypeBuilder(table)); } //Navigation properties foreach (Table table in tables) { CreateNavigationProperties(table); } //Creates DbSet Propeties for the Context foreach (Table ti in tables) { PocoTypeBuilder = TypeBuilders[ti.VariableName]; PocoType = PocoTypeBuilder.CreateType(); Types.Add(ti.VariableName, PocoType); DynamicTypeBuilder.CreateProperty(ContextTypeBuilder, ti.VariableName, typeof(DbSet <>).MakeGenericType(new Type[] { PocoType }), false); } Type type = ContextTypeBuilder.CreateType(); return(type); }
public Type CreateContextType(List <Table> tables, string cString) { Types.Clear(); TypeBuilders.Clear(); _logger.LogTrace("Start building runtime DynamicDbContext"); //Context ContextTypeBuilder = _typeBuilder.GetTypeBuilder("DynamicDbContext", typeof(DbContextBase)); //Context Constructor System.Reflection.Emit.ConstructorBuilder constructor = ContextTypeBuilder.DefineDefaultConstructor( System.Reflection.MethodAttributes.Public | System.Reflection.MethodAttributes.SpecialName | System.Reflection.MethodAttributes.RTSpecialName); //Create Normal Poco Type to be used as a reference foreach (Table table in tables) { TypeBuilders.Add(table.VariableName, CreatePocoTypeBuilder(table)); } _logger.LogTrace("Start building navigation properties"); //Navigation properties foreach (Table table in tables) { CreateNavigationProperties(table); } _logger.LogTrace("Start building Dbset for each table"); //Creates DbSet Properties for the Context foreach (Table ti in tables) { var pocoTypeBuilder = TypeBuilders[ti.VariableName]; var pocoType = pocoTypeBuilder.CreateType(); Types.Add(ti.VariableName, pocoType); _typeBuilder.CreateProperty(ContextTypeBuilder, ti.VariableName, typeof(DbSet <>).MakeGenericType(new Type[] { pocoType }), false); } _logger.LogTrace("Start building OnConfiguring override method."); // context OnConfiguring method override. var onConfiguringMethod = ContextTypeBuilder.OverrideOnConfiguring(cString); ContextTypeBuilder.DefineMethodOverride(onConfiguringMethod, typeof(DbContext).GetMethod("OnConfiguring", BindingFlags.Instance | BindingFlags.NonPublic)); Type type = ContextTypeBuilder.CreateType(); if (_config.SaveLibraryRunTime) { _logger.LogTrace("Try saving the created DbContext into the disk."); _typeBuilder.SaveTypeBuilder(ContextTypeBuilder, "DynamicDataStore"); } _logger.LogTrace("Done building Dynamic DbContext."); return(type); }