C# 当支持字段包含项时,NHibernate 3.2集合属性为空
我使用的是NHibernate 3.2,在映射集合时遇到问题C# 当支持字段包含项时,NHibernate 3.2集合属性为空,c#,.net,nhibernate,nhibernate-mapping,C#,.net,Nhibernate,Nhibernate Mapping,我使用的是NHibernate 3.2,在映射集合时遇到问题 public class DefaultDynamicLazyFieldInterceptor : IFieldInterceptorAccessor, Proxy.DynamicProxy.IInterceptor { ... public object Intercept(InvocationInfo info) { var methodName = info.TargetMetho
public class DefaultDynamicLazyFieldInterceptor
: IFieldInterceptorAccessor, Proxy.DynamicProxy.IInterceptor
{
...
public object Intercept(InvocationInfo info)
{
var methodName = info.TargetMethod.Name;
if (FieldInterceptor != null)
{
...
查询用户帐户后
UserAccount userAccount = (from u in Session.Query<UserAccount>()
where u.Username == username
select u).SingleOrDefault();
不过我不认为这里有什么特别的事情
编辑3
在调试拦截器(部分如下所示)时,我注意到当对methodName==“get_Roles”
调用拦截器时,对于TargetInstance
属性(在本例中是UserAccount
),它的Roles
字段是一个空集合。但是,在访问代理实例上的Roles
属性之前,代理的role
字段确实有一个填充的集合
public class DefaultDynamicLazyFieldInterceptor
: IFieldInterceptorAccessor, Proxy.DynamicProxy.IInterceptor
{
...
public object Intercept(InvocationInfo info)
{
var methodName = info.TargetMethod.Name;
if (FieldInterceptor != null)
{
...
检查InvocationInfo
实例时,proxy
和Target
实例确实有一个roles
字段,其中包含填充的集合
public class DefaultDynamicLazyFieldInterceptor
: IFieldInterceptorAccessor, Proxy.DynamicProxy.IInterceptor
{
...
public object Intercept(InvocationInfo info)
{
var methodName = info.TargetMethod.Name;
if (FieldInterceptor != null)
{
...
编辑4
我想我遇到过
编辑结束
以下是实体类:
public class UserAccount : Entity
{
...
private IList<Role> roles;
public virtual IEnumerable<Role> Roles
{
get
{
return roles;
}
}
...
}
public class Role : Entity
{
...
}
公共类用户帐户:实体
{
...
私人IList角色;
公共虚拟可数角色
{
得到
{
返回角色;
}
}
...
}
公共类角色:实体
{
...
}
以下是用于UserAccount映射的HBM映射文件的一部分:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property"
auto-import="false" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" dynamic-insert="true"
dynamic-update="true" schema="[MySchema]" mutable="true"
name="MyNamespace.UserAccount, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
table="UserAccounts">
...
<bag access="nosetter.camelcase" cascade="none" name="Roles"
schema="[MySchema]" table="UserAccounts_Roles" mutable="true">
<key>
<column name="UserAccountId" />
</key>
<many-to-many class="MyNamespace.Role, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<column name="RoleId" />
</many-to-many>
</bag>
...
</class>
</hibernate-mapping>
...
...
以下是HBM中指定角色映射的部分:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property"
auto-import="false" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" dynamic-insert="true"
dynamic-update="true" schema="[MySchema]" mutable="true"
name="MyNamespace.Role, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
table="Roles">
...
</class>
</hibernate-mapping>
...
尝试使用
bag access="field.camelcase"
而不是
bag access="nosetter.camelcase"
我刚刚检查了2772版本,显然它已经被修复,将在NHibernate的下一个主要版本(计划称为4.0)中发布。因此,我将问题标记为已回答,尽管有点为时过早。我遇到了同样的问题;让支持字段受到保护而不是私有对我来说很有用。这也影响到我。我无法找到使用显式支持字段的解决方案。相反,我使用了一个带有受保护setter的公共自动属性(
public virtual IEnumerable Users{get;protected set;}
),并将此属性强制转换为实体方法中的集合(var Users=this.Users as ICollection;
)。我还为实体提供了一个默认构造函数,为属性提供一个默认值(emptyHashSet
)。