Nhibernate映射内部类和InternalsVisibleTo

我的代理生成器无法为内部映射的Nhibernate类生成代理。 我尝试在assemblyinfo.cs中使用InternalsVisibleTo将它们添加为可见但它似乎不起作用。 更糟糕的是,我不知道如何判断我是否已成功设法成为我想要的代理程序集的朋友,因为如果我在assemblyinfo.cs中的代理程序集公钥中更改了一些数字,则不会抛出任何错误。

错误:

测试方法TestProject1.UnitTest1.TestMethod1抛出exception:NHibernate.HibernateException:创建代理实例失败—> Castle.DynamicProxy.Generators.GeneratorException:Type不公开,因此无法生成代理。 键入:BaseSystemCore.Domain.Lot

堆栈跟踪:

Castle.DynamicProxy.DefaultProxyBuilder.AssertValidType(Type target)Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxy(Type classToProxy,Type [] additionalInterfacesToProxy,ProxyGenerationOptions options)Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy,Type [] additionalInterfacesToProxy,ProxyGenerationOptions options,Object [] constructorArguments,IInterceptor []拦截器)NHibernate.ByteCode.Castle.ProxyFactory.GetProxy(Object id,ISessionImplementor session)NHibernateUtilities.BaseUnitOfWork.handleException(例外e)在C:\ Users \ Isaac.G \ Desktop \ svn.bolinger中。 ca \ Library Projects \ NHibernateUtilities \ NHibernateUtilities \ BaseUnitOfWork.cs:第871行NHibernateUtilities.BaseUnitOfWork.getAllT在C:\ Users \ Isaac.G \ Desktop \ svn.bolinger.ca \ Library Projects \ NHibernateUtilities \ NHibernateUtilities \ BaseUnitOfWork.cs:line 115 C:\ Users \ Isaac.G \ Desktop \ svn.bolinger.ca \ Library Projects \ BaseSystemCore \ TestProject1 \ UnitTest中的TestProject1.UnitTest1.TestMethod1() 1.cs:第71行

有没有人以前有这个工作?

谢谢

艾萨克

NHibernate 3.2内置了代理提供程序。 我简要地看看它们的来源似乎使用了这种格式:{0} ProxyAssembly。 其中{0}是延迟映射类的类型名称。 我没有测试过它。 尝试将以下内容添加到AssemblyInfo.cs并将{0}替换为您的惰性类名:

[assembly: InternalsVisibleTo("{0}ProxyAssembly")] 

如果您仍想使用旧版本的NHibernate,可以尝试使用它(对于城堡字节代码提供程序):

 [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

DynamicProxyGenAssembly2是一个由Castle动态生成的临时程序集。 它包含从映射类(代理)派生的类。

值得一提的是,这就是我投入T4的原因。 它会自动为我的实体生成所有InternalsVisibleTo属性。 希望能帮助到你。

 <#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="System.Core" #> <#@ assembly name="$(SolutionDir)\Domain\bin\Debug\Domain.dll" #> <#@ import namespace="System.Linq" #> <#@ output extension=".cs" #> using System.Runtime.CompilerServices; <# var publicType = typeof(Domain.Foo); var allTypes = publicType.Assembly.GetTypes(); var entityType = allTypes.Single(t => t.FullName == "Domain.Entities.Entity"); // my entity supertype foreach(var type in allTypes.Where(t => !t.IsAbstract && entityType.IsAssignableFrom(t))) {#> [assembly: InternalsVisibleTo("<#= type.Name #>ProxyAssembly")] <#}#>