Nhibernate映射内部类和InternalsVisibleTo

时间:2011-08-22 18:16:29

标签: c# nhibernate

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

错误:

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

堆栈跟踪:

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

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

由于

艾萨克

2 个答案:

答案 0 :(得分:7)

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

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

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

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

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

答案 1 :(得分:2)

为了它的价值,这就是我进入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")]
<#}#>