如何在N-Tier应用程序中使用Fluent NHibernate?

时间:2010-07-16 06:35:43

标签: nhibernate fluent-nhibernate n-tier-architecture

我正在尝试将Fluent NHibernate与我的项目一起使用,目前我可以从数据库中获取数据,当我在应用程序服务器时,数据包含其PK但是当我将此数据(作为List)返回给客户端时它的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;
}

当它仍在应用程序服务器数据时,如下图所示正确检索 alt text http://img138.imageshack.us/img138/1071/serverside.png

然而,当这些数据传回客户端时,它的所有PK都松散如下。 alt text http://img203.imageshack.us/img203/1664/clientside.png

2 个答案:

答案 0 :(得分:2)

首先,这不是Fluent NHibernate的问题所以:

  1. 序列化时,必须在POCO上使用Serializable。
  2. (来自您的评论)NHibernate将从数据库检索到的对象的引用保存到缓存(1级缓存)。在序列化此“托管”对象时,序列化的输出是非托管对象。 Nhibernate不会因为在新构造的对象中设置值而检测到db中存在对象。您必须从数据库中获取对象并更新其属性并调用Update(),或者使用从客户端返回的对象的纯sql(yikes!)。
  3. 请注意,与此问题无关:您的Equals()实现非常糟糕,因为它没有考虑类型并且仅依赖于GetHashCode值。如果你的所有课程都有这个实现,你可能会遇到麻烦。

答案 1 :(得分:0)