gpt4 book ai didi

c# - NHibernate 对象 ID 返回不正确的值

转载 作者:行者123 更新时间:2023-11-30 17:20:45 25 4
gpt4 key购买 nike

我正在使用 NHibernate,这不是家庭作业。

假设我从数据库中检索了一个 Faculty 类型的对象(假设是 XYZ 大学的工程学院)。它有 5 个与其关联的 Department 类型的子对象,并且根据数据库表应包含 ID 2、4、5、8 和 9。

我的第一个问题是,我看到关联的对象总是将 ID 设置为 0

Faculty-ID 正在正确加载。

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

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

如何选择ID==5的对象?

Faculty.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>

b_教师

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_部门

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]

编辑:

Faculty.cs

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; }
}

部门.cs

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();
}
}
}

FacultyRepository.cs

public class FacultyRepository : Repository<Faculty>
{
}

DepartmentRepository.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;
}
}
}

session 工厂.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();
}
}

这就是我所有的。

最佳答案

一个极其疯狂的猜测。您能否尝试在没有相等比较器和 Equals 实现的情况下运行您的代码,看看是否有帮助,因此使用以下实现:

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

您可能想尝试的另一件事是将 ID 设置为私有(private):

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

看看效果如何。

关于c# - NHibernate 对象 ID 返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4002037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com