Как использовать Fluent NHibernate в приложении N-Tier? - PullRequest
0 голосов
/ 16 июля 2010

Я пытаюсь использовать Fluent NHibernate с моим проектом, в настоящее время я могу получить данные из базы данных, когда я на сервере приложений, данные включают в себя их PK, но когда я возвращаю эти данные (в виде списка) клиенту все его ПК свободен.

Как я могу исправить эту проблему?

Обновление

Мой класс POCO ниже: PKs CountryCd и CityCd

public class coCity
{
    public virtual string CountryCd { get; private set; }
    public virtual string CityCd { get; private set; }
    public virtual string CityNameTH { get; set; }
    public virtual string CityNameEN { get; set; }
    public virtual int DeliveryLeadTime { get; set; }
    public virtual string CreateBy { get; set; }
    public virtual DateTime CreateDate { get; set; }
    public virtual string UpdateBy { get; set; }
    public virtual DateTime UpdateDate { get; set; }

    public override bool Equals(object obj)
    {
        return this.GetHashCode().Equals(obj.GetHashCode());
    }

    public override int GetHashCode()
    {
        return (this.CountryCd + this.CityCd).GetHashCode();
    }
}

Класс картирования:

public class coCityMap : ClassMap<coCity>
{
    public coCityMap()
    {
        Table("coCity"); // this is optional

        CompositeId()
            .KeyProperty(x => x.CountryCd)
            .KeyProperty(x => x.CityCd);
        Map(x => x.CityNameTH);
        Map(x => x.CityNameEN);
        Map(x => x.DeliveryLeadTime);
        Map(x => x.CreateBy);
        Map(x => x.CreateDate);
        Map(x => x.UpdateBy);
        Map(x => x.UpdateDate);
    }
}

Исходный код для получения данных на сервере приложений

public List<coCity> GetTest()
{
    List<coCity> result = new List<coCity>();

    var sessionFactory = CreateSessionFactory();

    using (var session = sessionFactory.OpenSession())
    {
        result = (List<coCity>)session.CreateCriteria(typeof(coCity)).List<coCity>();
    }

    return result;
}

Когда он все еще на сервере приложений, данные извлекаются правильно, как показано на рисунке ниже. альтернативный текст http://img138.imageshack.us/img138/1071/serverside.png

Однако, когда эти данные передаются обратно на сторону клиента, все его PK теряются, как показано ниже. альтернативный текст http://img203.imageshack.us/img203/1664/clientside.png

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Прежде всего, это не проблема с Fluent NHibernate, поэтому:

  1. Сериализуемый должен использоваться на ваших POCO, когда вы их сериализуете.
  2. (из вашего комментария) NHibernate хранит ссылку на объект, извлеченный из базы данных, в кеш (кеш 1-го уровня). Пока вы сериализуете этот «управляемый» объект, результатом сериализации является неуправляемый объект. Nhibernate не обнаруживает, что объект существует в БД только потому, что вы устанавливаете значение во вновь созданном объекте. Вы должны получить объект из базы данных и обновить его свойства и вызвать Update (), или вы работаете с чистым sql с объектом, который вернулся от клиента (yikes!).

Обратите внимание, что этот вопрос не имеет значения: ваша реализация Equals () действительно плохая, поскольку она не учитывает типы и зависит только от значения GetHashCode. Если у всех ваших классов есть эта реализация, у вас могут возникнуть проблемы.

0 голосов
/ 25 июля 2010

Я думаю, проблема в том, что этот частный установщик в свойствах ПК.Попробуйте изменить это для общественности.

В любом случае пометьте свою сущность Serializable

Несколько комментариев:

  • Как правило, при использовании nhibernate следует избегать составных идентификаторов.Создайте в своей модели суррогатный идентификатор, который является столбцом идентификаторов, и обеспечьте уникальность CityCd и CountryCd где-то еще
  • При передаче данных по уровням клиент / сервер рассмотрите возможность использования DTO , чтобы избежать некоторых общих LazyInitializationExceptionsпроблемы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...