NHibernate"不止一行"错误

时间:2014-07-21 21:15:54

标签: c# nhibernate fluent-nhibernate

我有一个系统,其中有用户,每个用户可以有多个票证,每个票证都分配给一个模拟器。 有一个函数来获取某个状态的所有票证,这会返回一个奇怪的错误。

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

它使用单个表(视图),因为有一些来自其他数据库的记录/字段,我甚至不知道它是如何到达那里的。

只有当我尝试这样做时才会出现此错误&#34;快速&#34;如果我逐行调试逐步调试每个函数,则错误不会发生。 我猜测NHibernate在运行速度和它应该的速度一样快时会返回错误,当我慢慢地运行它时......有效吗?

我已经通过此消息/类似消息检查了其他问题,但我仍然无法理解。

为什么以及究竟发生了什么以及如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

可能是Ticket,User和Simulator类中类似的ID命名吗?

顺便说一句,我注意到这个类叫做模拟器,但是错误说:Entity.Simulador

答案 1 :(得分:0)

我将此留待以备将来参考:发生此错误时, 与NHibernate相关。它在数据库中(一如既往)。

如果您收到此错误,并且您的类已正确映射,请按照以下步骤获取NHibernate正在使用的命令的查询/查询结果,并且您会注意到DB结构中存在错误/布局。 在某处,有一个结果返回具有唯一ID的同一对象的多个。