Nhibernat映射aspnet_Users表

时间:2010-03-31 18:26:09

标签: nhibernate fluent-nhibernate nhibernate-mapping

我的用户表我要映射到aspnet_Users:

<class name="User" table="`User`">
    <id name="ID" column="ID" type="Int32" unsaved-value="0">
        <generator class="native" />
    </id>

    <property name="UserId" column="UserId" type="Guid" not-null="true" />
    <property name="FullName" column="FullName" type="String" not-null="true" />
    <property name="PhoneNumber" column="PhoneNumber" type="String" not-null="false" />
</class>

我的aspnet_Users表:

<class name="aspnet_Users" table="aspnet_Users">
    <id name="ID" column="UserId" type="Guid" />
    <property name="UserName" column="UserName" type="string" not-null="false" />
</class>

我尝试添加一对一,一对多和多对一映射。我能得到的最接近的是这个错误:'System.Guid'类型的对象无法转换为'System.Int32'类型。

如何通过User中的UserId列创建从User到aspnet_User的单向映射?

我只想创建一个引用,这样我就可以提取只读信息,影响排序等。我仍然需要在用户设置中保留UserId列,就像现在一样。也许虚拟参考键入了UserId?这对Nhibernate来说是否可能?

不幸的是,它只是想使用来自用户的ID来映射到aspnet_Users。更改表用户将其主键设置为UserId而不是ID此时不是一个选项。

非常感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:0)

Aspnet_user表有一个Guid类型的主键。

您的表用户具有Int32类型的主键。

您可以查看此内容,因为您的用户表具有对aspnet_users表的引用(一对一)。

但是如果你看一下aspnet_users表,好像它是一个“一篮子价值”分配给用户(就像你有一种类型的用户(管理员,主持人,...),但那样做是多对一的引用(许多用户都有这种类型)你可以像这样映射它。

所以:

class User
{
     public virtual int ID { get; set; }
     public virtual Guid UserId { get; set; }
     public virtual string FullName { get; set; }
     public virtual string PhoneNumber { get; set; }   
}

class AspnetUser
{
     public virtual Guid ID { get; set; }
     public virtual string UserName { get; set; }
}

映射将是(使用fluent.NHibernate):

  public class User_Map : ClassMap<User>
  {
      public User_Map()
      {
           Table("User");
           ID(x => x.ID).GeneratedBy.Native();
           References(x => x.UserId);
           Map(x => x.FullName);
           Map(x => x.PhoneNumber);
      }
  }

  public class AspnetUser_Map : ClassMap<AspnetUser>
  {
      public User_Map()
      {
           Table("aspnet_Users");
           ID(x => x.ID).GeneratedBy.Assigned();
           Map(x => x.UserName);
      }
  }

答案 1 :(得分:0)

要获得有关此问题的进一步指导,请查看NHibernateProvider项目。他们已经创建了一个完整的成员资格提供程序实现,它使用了NHibernate。