Fluent nhibernate Fluent Hibernate复制记录而不是更新

Fluent nhibernate Fluent Hibernate复制记录而不是更新,fluent-nhibernate,Fluent Nhibernate,//下面是从具有save和//update方法的BO对象继承的域对象。 // //在我们的UI中,当用户单击//保存按钮时,我们希望能够执行以下操作。 // //插入新对象时,此方法可以正常工作。更新从数据库读取的//现有对象时,对象将被复制,而不是//更新。 // //不确定为什么SaveOrUpdate和Merge Nhibernate方法插入新//对象而不是更新记录? // //save方法是否不能判断对象是否有键,从而//更新而不是复制记录 private void Bt

//下面是从具有save和//update方法的BO对象继承的域对象。 //
//在我们的UI中,当用户单击//保存按钮时,我们希望能够执行以下操作。 //
//插入新对象时,此方法可以正常工作。更新从数据库读取的//现有对象时,对象将被复制,而不是//更新。 //
//不确定为什么SaveOrUpdate和Merge Nhibernate方法插入新//对象而不是更新记录? //
//save方法是否不能判断对象是否有键,从而//更新而不是复制记录

        private void BtnSave_Click(object sender, EventArgs e)
        {

            if (person.PersonID > 0)
            {
                person.Update();
            }
            person.Save();


        }



public class BO<T>
        {
            private ISessionFactory _sessionFactory;
            private ISession _session;

            public BO()
            {
               // CreateSession();
            }
            private void CreateSession()
            {
                string connectionString = "Data Source=(local)\\SQLExpress;Initial Catalog=c;Integrated Security=True;Pooling=true";
                /*
                 Hibernate start session to read and write to MSSQL database
                */
                if (_session != null && _session.IsOpen)
                {
                    _session.Flush();
                    _session.Close();
                }
                if (_sessionFactory != null && !_sessionFactory.IsClosed)
                {
                    _sessionFactory.Close();
                }
    //Create a new session from the session factory
                _sessionFactory = CWISessionFactory.CreateFactory<Person>(connectionString);
                _session = _sessionFactory.OpenSession();

            }
            public virtual void Update()
            {
                CreateSession();

                using (ITransaction tran = _session.BeginTransaction())
                {
                    bool isd = _session.IsDirty();
                     _session.SaveOrUpdate(this);

                    _session.Flush();
                    tran.Commit();

                    _session.Close();
                    _sessionFactory.Close();
                }
            }
            public virtual void Save()
            {
                CreateSession();
                {
                    using (ITransaction tran = _session.BeginTransaction())
                    {
                        bool isd = _session.IsDirty();
                       _session.Save(this);
                        CloseSession(tran);
                    }
                }

            }

            private void CloseSession(ITransaction tran)
            {
                _session.Flush();
                tran.Commit();
                _session.Close();
                _sessionFactory.Close();
            }
            private void CloseSession()
            {
                _session.Flush();
                _session.Close();
                _sessionFactory.Close();
            }
            public virtual ISession GetSession()
            {
                CreateSession();
                return _session;
            }
//Object collections can be retrieved from calling the method below.
            public virtual ICollection<T> Collection()
            {
                IList<T> ilist = new List<T>();

                CreateSession();
                if (typeof(T) == typeof(Country))
                {
                    ilist = _session.QueryOver<Country>().List<T>();
                }
                if (typeof(T) == typeof(Title))
                {
                    ilist = _session.QueryOver<Title>().List<T>();
                }
                else if (typeof(T) == typeof(Role))
                {
                    ilist = _session.QueryOver<Role>().List<T>();
                }
                else if (typeof(T) == typeof(Status))
                {
                    ilist = _session.QueryOver<Status>().List<T>();

                }
                else if (typeof(T) == typeof(Gender))
                {
                    ilist = _session.QueryOver<Gender>().List<T>();

                }
                CloseSession();
                return ilist;

            }
 //Can search for an object using the method below
            public virtual object GetObjectByKey(int key)
            {
                CreateSession();
                object o = _session.Get<T>(key);
                CloseSession();
                return o;


            }

        }

    //Business object currently not updating

     public class Person : BO<Person>
        {
            public Person()
            {
                Title = new Title();
                Gender = new Gender();
                Role = new Role();
                Status = new Status();
                //this.Address = new Address();
            }
            public virtual int PersonID
            {
                get;
                protected set;
            }
            public virtual string FirstName
            { get; set; }
            public virtual string SecondName
            { get; set; }
            public virtual string IDNumber
            { get; set; }
            public virtual string Initials
            { get; set; }
            public virtual string Surname
            { get; set; }
            public virtual DateTime ? DateOfBirth
            { get; set; }
            public virtual string HomeTelephone
            { get; set; }
            public virtual string WorkTelephone
            { get; set;
            }
            public virtual int TitleID
            { get; set; }
            public virtual string Email 
            { get; set; }
            public virtual string CellurPhoneNumber
            { get; set; }
            public virtual string Password
            { get; set; }
            public virtual int ? OccupationID
            { get; set; }
            public virtual bool AcceptedMandate
            { get; set; }
            public virtual int ? GenderID
            { get; set; }
            public virtual string InvestmentAccountNumber
            { get; set; }
            public virtual int ? StatusID
            {
                get;
                set;
            }
            public virtual int? RoleID
            {
                get;
                set;
            }
            public virtual int? AddressID
            {
                get;
                set;
            }
            public virtual Title Title
            {
                get;
                set;
            }
            public virtual Role Role
            {
                get;
                set;
            }
            public virtual Status Status
            {
                get;
                set;
            }
            public virtual Gender Gender
            {
                get;
                set;
            }

            public virtual Int32 CountryOfPassportID
            {
                get;set;
            }
            public virtual DateTime? PassportExpiryDate
            {
                get; set;
            }
            public virtual string PassportNumber
            {
                get; set;
            }
            public virtual Country CountryOfPassport
            {
                get;set;
            }
            public virtual Address Address
            {
                get; set;
            }
            public override string ToString()
            {
                return Surname+" "+FirstName+" "+SecondName;
            }
            public virtual IList<Person> Search(string firstname, string surname)
            {
                var session = GetSession();

                return session.CreateCriteria<Person>()
                .Add(Expression.Sql("lower(FirstName) like lower(?)", "%"+firstname.ToLower()+"%", NHibernateUtil.String))
                .Add(Expression.Sql("lower(Surname) like lower(?)", "%" + surname.ToLower()+ "%" , NHibernateUtil.String))
                .Add(Expression.Sql("RoleID = ?", 1, NHibernateUtil.Int32))
                //.Add(Expression.Eq("RoleID", 1))
                .List<Person>();

            }

            public virtual IList<Person> SearchNew(string passportnumber, string surname )
            {
                var session = GetSession();

                return session.CreateCriteria<Person>()            .List<Person>();

            }


        }

//Fluent mapping for Person object

    public class PersonMap : ClassMap<Person>
        {
            public PersonMap()
            {

                Id(x => x.PersonID).GeneratedBy.Increment().UnsavedValue(0);
                Map(x => x.AcceptedMandate);
                Map(x => x.CellurPhoneNumber );
                Map(x => x.DateOfBirth);
                Map(x => x.Email);
                Map(x => x.FirstName);
                //Map(x => x.GenderID);
                Map(x => x.HomeTelephone);
                Map(x => x.Initials);
                Map(x => x.InvestmentAccountNumber);
                Map(x => x.OccupationID);
                Map(x => x.Password);
                Map(x => x.SecondName);
                Map(x => x.IDNumber);
                Map(x => x.PassportExpiryDate);
                Map(x => x.PassportNumber);
                // Map(x => x.RoleID);
                Map(x => x.Surname);
               // Map(x => x.TitleID);
                Map(x => x.WorkTelephone);
                References(x => x.Role).Column("RoleID").Update().Insert().Cascade.None();
                References(x => x.Title).Column("TitleID").Update().Insert().Cascade.None();
                References(x => x.Status).Column("StatusID").Update().Insert().Cascade.None();
                References(x => x.Gender).Column("GenderID").Update().Insert().Cascade.None();
                References(x => x.CountryOfPassport).Column("CountryOfPassportID").Update().Insert().Cascade.None();
                References(x => x.Address).Column("AddressID").Update().Insert().Cascade.None();

            }

        }
   //Related object mapped to Person

//Business oject definition for Gender object related to person 
        public class Gender:BO<Gender>
        {

            public virtual int GenderID { get; protected set; }
            public virtual string Name { get; set; }
            public override string ToString()
            {
                return Name;
            }

        }
        class GenderMap : ClassMap<Gender>
        {
            public GenderMap()
            {

                Id(x => x.GenderID).GeneratedBy.Increment().UnsavedValue(0);
                Map(x => x.Name);

            }

        }
private void BtnSave\u单击(对象发送者,事件参数e)
{
如果(person.PersonID>0)
{
person.Update();
}
person.Save();
}
公共类BO
{
私人ISessionFactory(sessionFactory);;
非公开会议;
公营机构(
{
//CreateSession();
}
私有void CreateSession()
{
string connectionString=“数据源=(本地)\\SQLExpress;初始目录=c;集成安全性=True;池=True”;
/*
休眠启动会话以读取和写入MSSQL数据库
*/
if(_session!=null&&u session.IsOpen)
{
_session.Flush();
_session.Close();
}
if(_sessionFactory!=null&!_sessionFactory.IsClosed)
{
_sessionFactory.Close();
}
//从会话工厂创建新会话
_sessionFactory=CWISessionFactory.CreateFactory(connectionString);
_会话=_sessionFactory.OpenSession();
}
公共虚拟空间更新()
{
CreateSession();
使用(ITransaction tran=\u session.BeginTransaction())
{
bool isd=_session.IsDirty();
_会话。保存或更新(本);
_session.Flush();
trans.Commit();
_session.Close();
_sessionFactory.Close();
}
}
公共虚拟void Save()
{
CreateSession();
{
使用(ITransaction tran=\u session.BeginTransaction())
{
bool isd=_session.IsDirty();
_会话。保存(此);
闭门会议(tran);
}
}
}
专用无效关闭会话(ITransaction tran)
{
_session.Flush();
trans.Commit();
_session.Close();
_sessionFactory.Close();
}
私有会话()
{
_session.Flush();
_session.Close();
_sessionFactory.Close();
}
公共虚拟会话GetSession()
{
CreateSession();
返回会话;
}
//可以通过调用下面的方法检索对象集合。
公共虚拟ICollection集合()
{
IList IList=新列表();
CreateSession();
if(类型(T)=类型(国家))
{
ilist=_session.QueryOver().List();
}
if(类型(T)=类型(标题))
{
ilist=_session.QueryOver().List();
}
否则如果(类型(T)=类型(角色))
{
ilist=_session.QueryOver().List();
}
否则如果(类型(T)=类型(状态))
{
ilist=_session.QueryOver().List();
}
否则如果(类型(T)=类型(性别))
{
ilist=_session.QueryOver().List();
}
CloseSession();
返回ilist;
}
//可以使用以下方法搜索对象
公共虚拟对象GetObjectByKey(int-key)
{
CreateSession();
对象o=\u session.Get(键);
CloseSession();
返回o;
}
}
//当前未更新的业务对象
公众人物:薄熙来
{
公众人士()
{
标题=新标题();
性别=新性别();
角色=新角色();
状态=新状态();
//this.Address=新地址();
}
公共虚拟int PersonID
{
得到;
保护集;
}
公共虚拟字符串名
{get;set;}
公共虚拟字符串SecondName
{get;set;}
公共虚拟字符串ID号
{get;set;}
公共虚拟字符串首字母
{get;set;}
公共虚拟字符串姓氏
{get;set;}
公共虚拟日期时间?出生日期
{get;set;}
公共虚拟字符串家庭电话
{get;set;}
公共虚拟电话
{get;set;
}
公共虚拟整数标题
{get;set;}
公共虚拟字符串电子邮件
{get;set;}
公共虚拟字符串CellurPhoneNumber
{get;set;}
公共虚拟字符串密码
{get;set;}
公共虚拟图书馆
            if (person.PersonID > 0)
            {
                person.Update();
            }
            else
            {
                 person.Save();
            }
    public ctrlClient(Person person)
    {
        InitializeComponent();
        this.person =(Person) person.GetObjectByKey(person.PersonID);

        Create();
    }