代码之家  ›  专栏  ›  技术社区  ›  David

如何在N层应用中使用Fluent-NHibernate?

  •  0
  • David  · 技术社区  · 15 年前

    我正在尝试在我的项目中采用Fluent NHibernate,目前我可以从数据库中获取数据,当我在application server时,数据包括它的PK,但是当我将这个数据(作为列表)返回给客户端时,它的PK都是松散的。

    我怎样才能解决这个问题?

    更新

    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

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   Jaguar    15 年前

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

    1. 序列化POCO时,必须在POCO上使用Serializable。
    2. (根据您的评论)NHibernate将从数据库检索到的对象的引用保存到缓存(一级缓存)。序列化此“托管”对象时,序列化的输出是非托管对象。Nhibernate不会仅仅因为在新构造的对象中设置了一个值就检测到数据库中存在一个对象。必须从数据库中获取对象并更新其属性并调用update(),或者使用纯sql处理从客户机返回的对象(yikes!)。

        2
  •  0
  •   Pedro    15 年前

    我认为问题在于PK属性上的私有setter。试着把它改成公共的。

    不管怎样,用 Serializable

    • 使用nhibernate的一般建议是避免使用复合id。在模型上创建一个作为标识列的代理项Id,并在其他地方强制CityCd和CountryCd的唯一性
    • DTOs 以避免一些常见的LazyInitializationExceptions问题。
    推荐文章