由typebuilder构建的automap动态类型,具有流畅的nhibernate

时间:2013-03-21 20:46:00

标签: nhibernate fluent automapping typebuilder

我想知道这些方法和工具是否会起作用。我的计划是在每个类型构建器的运行时定义和创建类的实例,然后通过自动化将它们映射到流畅的nhibernate。这可能吗?你的想法是什么?

示例:

private static ISessionFactory CreateSessionFactory(Type _type, Assembly a)
{

      //Database config here...

    ISessionFactory sessionFactory = Fluently.Configure()
        .Database(cfg)
        .Mappings(m => m.AutoMappings.Add(
            AutoMap.Assembly(a))) 
        .ExposeConfiguration(BuildSchema)
        .BuildConfiguration()
        .BuildSessionFactory();

    return sessionFactory;
}

private static void BuildSchema(Configuration config)
{
    new SchemaExport(config)
        .Create(true, false);
}

static void Main(string[] args)
{
    AssemblyName aName = new AssemblyName("DynamicAssemblyExample");
    AssemblyBuilder ab =
        AppDomain.CurrentDomain.DefineDynamicAssembly(
            aName,
            AssemblyBuilderAccess.Run);

    ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);

    TypeBuilder tb = mb.DefineType(
        "MyDynamicType",
         TypeAttributes.Public);

    FieldBuilder fbNumber = tb.DefineField(
        "_ID",
        typeof(int),
        FieldAttributes.Public);

    PropertyBuilder pbNumber = tb.DefineProperty(
        "ID",
        PropertyAttributes.HasDefault,
        typeof(int),
        null);

    MethodAttributes getSetAttr = MethodAttributes.Public |
    MethodAttributes.SpecialName | MethodAttributes.HideBySig;

    MethodBuilder mbNumberGetAccessor = tb.DefineMethod(
        "get_ID",
        getSetAttr,
        typeof(int),
        Type.EmptyTypes);

    ILGenerator numberGetIL = mbNumberGetAccessor.GetILGenerator();

    numberGetIL.Emit(OpCodes.Ldarg_0);
    numberGetIL.Emit(OpCodes.Ldfld, fbNumber);
    numberGetIL.Emit(OpCodes.Ret);

    MethodBuilder mbNumberSetAccessor = tb.DefineMethod(
        "set_ID",
        getSetAttr,
        null,
        new Type[] { typeof(int) });

    ILGenerator numberSetIL = mbNumberSetAccessor.GetILGenerator();

    numberSetIL.Emit(OpCodes.Ldarg_0);
    numberSetIL.Emit(OpCodes.Ldarg_1);
    numberSetIL.Emit(OpCodes.Stfld, fbNumber);
    numberSetIL.Emit(OpCodes.Ret);

    pbNumber.SetGetMethod(mbNumberGetAccessor);
    pbNumber.SetSetMethod(mbNumberSetAccessor);

    Type t = tb.CreateType();

    Activator.CreateInstance(t);

    var sessionFactory = CreateSessionFactory(t, (Assembly) ab);

    using (var session = sessionFactory.OpenSession())
    {
        using (var transaction = session.BeginTransaction())
        {
        }
    }
}

结果是ISessionFactory sessionFactory = Fluently.Conf..处的异常说:{动态程序集不支持调用的成员}

0 个答案:

没有答案