2010-03-18 2 views
-1

Я пытаюсь сопоставить пользователей друг с другом. Senario, что пользователи могут иметь приятель, так что ссылки на себяОтображение 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

Просто замените многих-на-многие на одного-на-многие. оно работает. –

ответ

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

+0

Извините, я отредактировал – jim

+0

Итак, это работает, но как бы я его запросил? – john

0

Рассмотрим использование шаблона хранилища. Создайте контракт с репозиторием и базовый абстрактный класс, который берет одну из ваших объектов как тип (ваш сопоставленный класс)

Открыть сеанс, когда репозиторий инициализируется и закрывается при его уничтожении. (реализовать IDisposable).

Затем убедитесь, что все ваш доступ к сессии происходит внутри с помощью утверждения: [псевдо-код]:

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, но вы получите дрейф. Они предназначены для того, чтобы ваши единицы работы были небольшими, откройте сеанс, только когда у вас есть что-то делать с базой данных, а затем дайте ему закрыть доступ к распоряжению. Вот базовый класс, отказ от ответственности 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); 
    } 
} 
Смежные вопросы