Nhibernate映射

时间:2010-03-18 07:12:21

标签: nhibernate nhibernate-mapping

我正在尝试将用户映射到彼此。 Senario是用户可以有好友,所以它链接到自己

我在想这个

  public class User
    {
        public virtual Guid Id { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual string EmailAddress { get; set; }
        public virtual string Password { get; set; }
        public virtual DateTime? DateCreated { get; set; }
        **public virtual IList<User> Friends { get; set; }**
        public virtual bool Deleted { get; set; }
    }

但是我正在努力做xml映射。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MyVerse.Domain"
                   namespace="MyVerse.Domain" >
  <class name="User" table="[User]">
    <id name="Id">
      <generator class="guid" />
    </id>
    <property name="FirstName" />
    <property name="LastName" />
    <property name="EmailAddress" />
    <property name="Password" />
    <property name="DateCreated" />
    <property name="Deleted" />
    <set name="Friends" table="UserFriend">
      <key foreign-key="Id"></key>
      <many-to-many class="User"></many-to-many>
    </set>
  </class>
</hibernate-mapping>

2 个答案:

答案 0 :(得分:0)

类似

 <bag name="Friends" table="assoc_user_table" inverse="true" lazy="true" cascade="all">
  <key column="friend_id" />
  <many-to-many class="User,user_table" column="user_id" />
</bag>

答案 1 :(得分:0)

考虑使用存储库模式。创建一个Repository契约和一个基本抽象类,它将您的某个实体作为一个类型(您的映射类)

初始化存储库时打开会话,销毁时关闭。 (实施IDisposable)。

然后确保您对会话的所有访问都在using语句中发生: [伪代码]:

using(var repository = RepositoryFactory<EntityType>.CreateRepository())
{
   var entity = repository.get(EntityID);

   foreach (somesubclass in entity.subclasscollection)
   {
          //Lazy loading can happen here, session is still open with the repository
          ... Do Something
   }
}

我为我的存储库使用基本抽象类。这个是我的readonly存储库,但你会得到漂移。它们的关键是保持您的工作单元较小,只有在您与数​​据库有关时才打开会话,然后让它关闭在dispose上。这是基类,免责声明YMMV:

public interface IEntity
{
     int Id { get; set; }
}

public interface IRORepository<TEntity> : IDisposable where TEntity : IEntity
{
    List<TEntity> GetAll();
    TEntity Get(int id);
}

public abstract class RORepositoryBase<T> : IRORepository<T> where T : IEntity
{
    protected ISession NHibernateSession;

    protected RORepositoryBase()
    {
        NHibernateSession = HibernateFactory.OpenSession();
        NHibernateSession.DefaultReadOnly = true;
    }

    public ISession Session { get { return NHibernateSession; } }
    public void Dispose()
    {
        NHibernateSession.Flush();
        NHibernateSession.Close();
        NHibernateSession.Dispose();
    }

    public virtual List<T> GetAll()
    {
        return NHibernateSession.Query<T>().ToList();
    }

    public virtual T Get(int id)
    {
        return NHibernateSession.Get<T>(id);
    }
}