2010-03-18 219 views
-1

我正试图将用户映射到对方。在塞纳里奥是,用户可以有哥们,所以它链接到自己Nhibernate映射

我想这

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; } 
    } 

,但我strugling做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> 
+0

只需将多对多替换为一对多即可。有用。 – 2014-03-26 04:45:26

回答

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> 
+0

它应该不是很多很多? – john 2010-03-18 07:21:02

+0

对不起,我编辑了 – jim 2010-03-18 07:23:27

+0

好,所以这个工程,但我会如何查询它? – john 2010-03-18 07:33:45

0

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

存储库初始化时打开会话,销毁时关闭。 (实现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 
    } 
} 

我用一个抽象基类为我的存储库。这是我的只读仓库,但你会得到漂移。他们的关键是保持你的工作单元很小,只有在与数据库有关的情况下才打开会话,然后让它关闭处理。以下是基类,免责声明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); 
    } 
}