Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当支持字段包含项时,NHibernate 3.2集合属性为空_C#_.net_Nhibernate_Nhibernate Mapping - Fatal编程技术网

C# 当支持字段包含项时,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

我使用的是NHibernate 3.2,在映射集合时遇到问题

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;
)。我还为实体提供了一个默认构造函数,为属性提供一个默认值(empty
HashSet
)。