2012-06-07 2 views
0

В настоящее время я работаю над приложением и ASP.NET MVC, в котором у меня есть User сущность, как следующим образом:Как карта и ссылки на объекты из других источников данных с NHibernate

public class User 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Name { get; protected set; } 
    public virtual string Role { get; protected set; } 
    public virtual Location Location { get; protected set; } 
} 

Где место просто так просто :

public class Location 
{ 
    public virtual string Id { get; protected set; } 
    public virtual string Building { get; protected set; } 
    public virtual string City { get; protected set; } 
    public virtual string Region { get; protected set; } 
} 

Мое осложнение возникает потому, что я хочу, чтобы заполнить User из Active Directory, а не базы данных. Кроме того, несколько классов сохраняли в базе данных ссылку на пользователя как свойство. У меня есть ADUserRepository для извлечения, но я не знаю, как интегрировать этих пользователей в мой графа объектов, когда все остальные управляются NHibernate.

Есть ли способ, чтобы NHibernate сохранял только идентификатор для User без его внешнего ключа к таблице Users? Могу ли я сопоставить его как компонент для достижения этого? Я также посмотрел на реализацию IUserType, чтобы сделать перевод. Таким образом, он будет сопоставляться с простым полем, и ADUserRepository может быть помещен в цепочку для разрешения сохраненного идентификатора. Или я пытаюсь взломать что-то, что не реально? Это мой первый раз с NHibernate, поэтому я ценю любые идеи или решения, которые вы можете дать. Благодарю.

Update

Оказывается, мое лучшее решение по этому вопросу будет сопоставить пользователя с IUserType и вводят (предпочтительно с StructureMap) услугу для заполнения объекта до его возвращается. В этом свете есть несколько вопросов, которые касаются этой темы, в основном предполагающей необходимость использования пользовательского ByteCodeProvider. Должен ли я все же сделать это, чтобы IUserType мог взять параметризованный конструктор или сделать комментарии здесь: NHibernate.ByteCode.LinFu.dll For NHibernate 3.2 сделать разницу?

+0

Если пользователь объект имеет соответствующую таблицу с информацией, которая гидратированный от активного каталога определенных свойств (т.е. некартированного), то это, безусловно, можно с помощью рамки EventListeners NHibernate в { Ns: NHibernate.Event} или IInterceptor {Ns: NHibernate}. – kalki

+0

На данный момент у пользователей нет собственной таблицы. Я экспериментировал с этим подходом, реализуя PostLoadEventListener, но для каждого объекта, который ссылается на пользователя, потребуется логика. Я предпочел бы скрыть, как пользователь возвращается от этих объектов. – user1325699

+0

вам не нужно будет предоставлять вам интерфейс, чтобы идентифицировать объект с пользователем как членом. IUserType, безусловно, является опцией, в которой я сомневаюсь, что это всегда была явная спецификация, необходимая для hbm (не очень хорошо разбирающаяся с беглостью, поэтому не знаю об этом), я полагаю, что каждый из его яда! – kalki

ответ

0

с использованием UserType для преобразования пользователя идентификатора и обратно

public class SomeClass 
{ 
    public virtual string Id { get; protected set; } 
    public virtual User User { get; protected set; } 
} 

// in FluentMapping (you have to translate if you want to use mapping by code) 

public SomeClassMap() 
{ 
    Map(x => x.User).Column("user_id").CustomType<UserType>(); 
} 

public class UserType : IUserType 
{ 
    void NullSafeSet(...) 
    { 
     NHibernateUtil.Int32.NullSafeSet(cmd, ((User)value).Id, index); 
    } 
    void NullSafeGet(...) 
    { 
     int id = (int)NHibernateUtil.Int32.NullSafeGet(cmd, ((User)value).Id, index); 
     var userrepository = GetItFromSomeWhere(); 
     return userrepository.FindById(id); 
    } 
}