NHibernate“多行”;错误
本文关键字:错误 多行 NHibernate | 更新日期: 2023-09-27 18:13:52
我有一个系统,其中有用户,每个用户可以有多个票证,每个票证分配给一个模拟器。有一个函数可以获取某个状态下的所有票,但这会返回一个奇怪的错误。
public class User
{
public int ID { get; set; }
}
public class Simulator
{
public int ID { get; set; }
}
public class Ticket
{
public int ID { get; set; }
public User User { get; set; }
public Simulator Simulator { get; set; }
}
NHibernate函数如下:
public IList<Ticket> GetActiveTicketsPerUser(int userID)
{
var criteria = Repository.Session.GetSession().CreateCriteria("GetTickets", "Ticket");
criteria.Add(Restrictions.Eq("Ticket.User.ID", userID));
criteria.Add(Restrictions.Eq("Ticket.Status.ID", new List<int>() { 1, 2 }); //Status the active tickets
return criteria.List<Ticket>();
}
这很好,每次都正确返回票,但是在下一节中发生错误:
public HttpResponseMessage GetActiveTickets()
{
try
{
int userID = Convert.ToInt32(HttpContext.Current.Items["UserID"]);
IList<Ticket> ticketList = Service.GetTickets(userID);
//Converting to another type specific to return in the HttpResponseMessage
IList<TicketResponse> rTickets = new List<TicketResponse>();
for(int i = 0; i < ticketList.Count; i++)
{
TicketResponse ticket = TResponse.Convert(ticketList[i]);
rTickets.Add(ticket);
}
return Request.CreateResponse(HttpStatusCode.OK, rTickets);
}
catch (Exception ex)
{
}
}
在一个特定的情况下,有多个门票(10+,当通常一次少于5个活动时),我得到NHibernate.HibernateException: More than one row with the given identifier was found: 1684, for class: Entity.Simulador
的错误
我已经检查了数据库,只有一个ID 1684的模拟器,另外,它是一个唯一的键列。Ticket类的映射如下:
public class TicketMap : ClassMapping<Ticket>
{
Lazy(true);
ID(x => x.ID, map => { map.Column("TicketID"); map.Generator(Generators.Identity); });
ManyToOne(x => x.Simulator, map => { map.Column("SimulatorID"); map.Cascade(Cascade.None); });
}
它使用单个表(视图),因为有一些记录/字段来自其他数据库,我甚至不知道它是如何到达的。
这个错误只发生在我尝试"快速"的时候,如果我逐行调试每个函数,错误就不会发生。我猜NHibernate是返回一些错误的东西,当它运行得很快,因为它应该是,当我慢慢去…作品吗?
我已经检查了这条信息/类似信息的其他问题,但我仍然无法理解。
为什么,到底发生了什么,我怎么解决这个问题?
可能是Ticket、User和Simulator类中ID的相似命名吗?
顺便说一句,我注意到类被称为模拟器,但错误说:实体。Simulador
我留下这个供将来参考:当这个错误发生时,它是而不是与NHibernate相关。它在数据库中(一如既往)。
如果你得到这个错误,并且你的类被正确映射,按照步骤获取NHibernate正在使用的命令的查询/查询结果,你会注意到在DB结构/布局中有一个错误。在某个地方,有一个返回多个具有唯一ID的相同对象的结果。
当NHibernate会话缓存已经包含一个具有相同标识符的实体并且你的代码试图从数据库中获取一个新的副本到会话