2

我有一个代表一个人的实体类和一个代表一个人拥有的权限的枚举。我试图通过代码使用 nhibernate 映射将此关系映射到数据库,但没有成功。

代码如下所示:

public enum Permissions
{
  None = 1,
  CanUpdate = 2,
  CanInsert = 3,
  CanDelete = 4
}

public class Person
{
   private ICollection<Permissions> permissions;

   public Person()
   {
      this.permissions = new Collection<Permissions>();
   }

   public virtual ICollection<Permissions> Permissions
   {
      get
      {
         return this.permissions;
      }
   }
}

public class PersonMap : ClassMapping<Person>
{
   public PersonMap()
   {
      this.Set(
        x => x.Permissions,
        m =>
          {
             m.Access(Accessor.Field);
             m.Key(k => k.Column("PersonId"));
             m.Table("PersonHasPermission");
          },
        map => map.Element(
        p =>
          {
             p.Column("PermissionId");
             p.Type<NHibernate.Type.EnumType<Permissions>>();
          }));
    }
}

数据库表如下所示:

Person
-----------------------
PersonId (PK, uniqueidentifier, not null)
Name (nvarchar(max), not null)


PersonHasPermission
-----------------------
PersonId (PK, FK, uniqueidentifier, not null)
PermissionId (PK, FK, int, not null)

因此,使用此配置,我没有遇到任何异常,但每当我尝试获取某人的权限时,即使数据库中有数据,集合也始终为空。

我希望上面的代码解释了我想要实现的目标,但如果需要进一步说明,请告知。

对此的任何帮助将不胜感激。提前致谢。

4

1 回答 1

0

我正在使用 XML 配置,甚至可以在其中映射受保护或私有成员。因此,令我惊讶的是您没有收到任何异常。因为您的 Collection 没有任何设置器(公共或受保护)。我希望是这样的: NHibernate.PropertyNotFoundException: {"Could not find a setter for property 'Permissions' in class 'Person'"} 但也许 fluent 能够将您的映射从属性转换为字段。

我尝试使用公共设置器或字段(均如下所示)测试您的代码并且它有效。有我的 xml 映射片段:

<!-- public or protected setter -->
<bag name="Permissions" inverse="false" lazy="true" table="PresonHasPermission" cascade="all">
   <key column="PersonId" />          
   <element type="Permissions" column="PermissionId" />
</bag>

<!-- accessing the field -->
<bag name="permissions" inverse="false" lazy="true" table="PresonHasPermission" cascade="all"
   access="field" >
   <key column="PersonId" />          
   <element type="Permissions" column="PermissionId" />
</bag>

(映射到字段时保持定义不变)

于 2012-11-02T17:46:52.777 回答