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

NHibernate对象id返回的值不正确

  •  3
  • user366312  · 技术社区  · 15 年前

    我用的是NHibernate,这不是家庭作业。

    假设我检索到一个类型为 Faculty (假设是XYZ大学的工程学院)。它有5个子对象与之关联,类型为 Department

    我的第一个问题是, ID 设置为 0

    教职员工ID加载正确。

    我的第二个问题是,我需要将它们加载到一个组合框中,并希望选择ID为5的对象。

    如何解决ID设置为0的问题?我不知道为什么会这样。

    教员.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>
    
    <hibernate-mapping
        xmlns="urn:nhibernate-mapping-2.2"
        namespace="UserManagememntApplication.BO"
        assembly="UserManagememntApplication.BO" >
    
      <class name="Faculty" table="b_Faculty">
        <id column="ID" name="ID" type="System.Int32" >
          <generator class="native" />
        </id>
    
        <property column="Code" name="Code" />
        <property column="Name" name="Name" />
        <property column="IsActive" name="IsActive" />
    
        <bag name="DepartmentItems" table="b_Department">
          <key column="FacultyID"/>
          <one-to-many class="Department" />
        </bag>
      </class>
    </hibernate-mapping>
    

    部门.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>
    
    <hibernate-mapping
        xmlns="urn:nhibernate-mapping-2.2"
        namespace="UserManagememntApplication.BO"
        assembly="UserManagememntApplication.BO" >
    
      <class name="Department" table="b_Department">
        <id column="ID" name="ID" type="System.Int32" >
          <generator class="native" />
        </id>
    
        <property column="Code" name="Code" />
        <property column="Name" name="Name" />
        <property column="IsActive" name="IsActive" />
    
        <many-to-one name="Faculty" class="Faculty" column="FacultyID" unique="true"  />
    
        <bag name="TeacherItems" table="b_Teacher">
          <key column="DepartmentID"/>
          <one-to-many class="Teacher" />
        </bag>
      </class>
    </hibernate-mapping>
    

    教师

    CREATE TABLE [dbo].[b_Faculty](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [Code] [varchar](50) NOT NULL,
        [Name] [varchar](50) NOT NULL,
        [IsActive] [bit] NOT NULL,
     CONSTRAINT [PK_b_Faculty] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    

    búU部门

    CREATE TABLE [dbo].[b_Department](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [FacultyID] [int] NOT NULL,
        [Code] [varchar](50) NOT NULL,
        [Name] [varchar](50) NOT NULL,
        [IsActive] [bit] NOT NULL,
     CONSTRAINT [PK_b_Department] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    

    编辑:

    计算机系

    public class Faculty : BusinessObject<Faculty>
        {
            public virtual string Code { get; set; }
            public virtual string Name { get; set; }
            public virtual bool IsActive { get; set; }
    
            public virtual IEnumerable<Department> DepartmentItems { get; set; }
        }
    

    public class Department : BusinessObject<Department>
        {
            public virtual string Code { get; set; }
            public virtual string Name { get; set; }
            public virtual bool IsActive { get; set; }
    
            public virtual Faculty Faculty { get; set; }
    
            public virtual IEnumerable<Teacher> TeacherItems { get; set; }
        }
    

    业务对象.cs

    public abstract class BusinessObject<T> : IBusinessObject where T : BusinessObject<T>
        {
            public int ID { get; set; }
    
            public static bool operator ==(BusinessObject<T> item1, BusinessObject<T> item2)
            {
                bool same = false;
    
                if (!object.ReferenceEquals(item1, null) && !object.ReferenceEquals(item2, null))
                {
                    if (item1.ID == item2.ID)
                    {
                        same = true;
                    }
                }
    
                else
                {
                    if (object.ReferenceEquals(item1, null) && object.ReferenceEquals(item2, null))
                    {
                        same = true;
                    }
                }
    
                return same;
            }
    
            public static bool operator !=(BusinessObject<T> item1, BusinessObject<T> item2)
            {
                return !(item1 == item2);
            }
    
            public override bool Equals(object obj)
            {
                //If "obj" is null, they are obviously not equal.
                if (obj == null)
                {
                    return false;
                }
    
                //If the objects are the same instance, they must be equal.
                if (Object.ReferenceEquals(this, obj))
                {
                    return true;
                }
    
                //If the objects are not the same type, they cannot be equal.
                if (this.GetType() != obj.GetType())
                {
                    return false;
                }
    
                T objCustomer = (T)obj;
    
                if (this.ID > 0 && objCustomer.ID > 0)
                {
                    if (this.ID.Equals(objCustomer.ID))
                    {
                        return true;
                    }
    
                }
                return false;
            }
    
            public override int GetHashCode()
            {
                if (this.ID <= 0)
                {
                    return base.GetHashCode();
                }
                else
                {
                    return ID.GetHashCode();
                }
            }
        }
    

    public class FacultyRepository : Repository<Faculty>
        {
        }
    

    部门存储库.cs

    public class DepartmentRepository : Repository<Department>
        {
        }
    

    存储库.cs

    public class Repository<T> : IRepository<T>
        {
            ISession _session;
    
            public Repository() 
            {
                _session = SessionFactory.GetOpenSession();
            }
    
            public T Get(object id)
            {
                T obj = default(T);
    
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        obj = (T)_session.Get<T>(id);
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
    
                return obj;
            }
    
            public IEnumerable<T> Get(string fieldName, object fieldValue)
            {
                IEnumerable<T> list = null;
    
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        list = (IEnumerable<T>)_session.CreateCriteria(typeof(T))
                            .Add(new NHibernate.Expression.EqExpression(fieldName, fieldValue))
                            .List<T>();
    
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
    
                return list;
            }
    
            public IEnumerable<T> Get()
            {
                IEnumerable<T> list = null;
    
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        list = (IEnumerable<T>)_session.CreateCriteria(typeof(T)).List<T>();
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
    
                return list;
            }
    
            public void SaveOrUpdate(T obj)
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        _session.SaveOrUpdateCopy(obj);
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
            }
    
            public void SaveOrUpdate(IEnumerable<T> objs)
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
    
                        foreach (T obj in objs)
                        {
                            _session.SaveOrUpdate(obj);
                        }
    
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
            }
    
            public void Delete(T obj)
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        _session.Delete(obj);
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();                
                    _session.Clear();
    
                    throw ex;
                }
            }
    
            public void Delete(IEnumerable<T> objs)
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
    
                        foreach (T obj in objs)
                        {
                            _session.Delete(obj);
                        }
    
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();
    
                    throw ex;
                }
            }
    
            public void DeleteAll()
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
    
                        DetachedCriteria criterion = DetachedCriteria.For<T>();
                        IList<T> list = criterion.GetExecutableCriteria(_session).List<T>();
    
                        foreach (T item in list)
                        {
                            _session.Delete(item);
                        }
    
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
    
                    throw ex;
                }
            }
    
            public void Dispose()
            {
                if (_session != null)
                {
                    _session.Clear();
                    _session.Close();
                    _session = null;
                }
            }
        }
    

    会话工厂.cs

    public class SessionFactory
        {
            private static ISessionFactory _sessionFactory = null;
            private SessionFactory(){}
    
            static SessionFactory()
            {
                if (_sessionFactory == null)
                {
                    Configuration configuration = new Configuration();
                    configuration.Configure();
                    _sessionFactory = configuration.BuildSessionFactory();
                }
            }
    
            public static ISession GetOpenSession()
            {
                return _sessionFactory.OpenSession();
            }
        }
    

    3 回复  |  直到 15 年前
        1
  •  2
  •   Pieter van Ginkel    15 年前

    一个非常疯狂的猜测。你能试着在没有相等比较器和 Equals 执行并查看是否有帮助,因此执行以下操作:

    public abstract class BusinessObject<T> : IBusinessObject where T : BusinessObject<T>
    {
        public int ID { get; set; }
    }
    

    另一件事你可能想尝试设置 ID 私人:

    public abstract class BusinessObject<T> : IBusinessObject where T : BusinessObject<T>
    {
        public int ID { get; private set; }
    }
    

    看看这有什么效果。

        2
  •  0
  •   Pieter van Ginkel    15 年前

    关于 ComboBox

    var faculty = GetFaculty();
    int selectedID = 5;
    
    int selectedIndex = -1;
    
    comboBox1.BeginUpdate();
    
    comboBox1.Items.Clear();
    
    foreach (var department in faculty.DepartmentItems)
    {
        int index = comboBox1.Items.Add(department);
    
        if (department.ID == selectedID)
            selectedIndex = index;
    }
    
    if (selectedIndex != -1)
        comboBox1.SelectedIndex = selectedIndex;
    
    comboBox1.EndUpdate();
    
        3
  •  0
  •   CobyC    10 年前

    我遇到了一个类似的问题,在执行select之后id返回为0。 我使用的是Fluent Nhibernate,在persistent类和子类中都声明了id字段。