Nhibernate:session.update()和session.delete()之后数据库值不变

时间:2013-09-21 15:52:50

标签: c# session nhibernate

Session.queryover()和session.save()运行良好。从数据库获取数据或将数据保存到数据库的所有逻辑都运行良好。不会反映通过session.update()和session.delete()更改数据库。没有引起任何异常。使用session.SaveOrUpdate并没有解决这个问题。 这是我的映射

[Serializable]
public class Requirement
{
   public virtual int Id { get; set; }
   public virtual int CreditRequired { get; set; }
   public virtual string Name { get; set; }
   public virtual IList<CourseRequirement> CourseRequirements
   {
       get
       {
           return new RequirementBC().getCourseRequirement(Id);
       }
   }


   public Requirement()
   { }

   public Requirement(DataRow row)
   {
       Id = int.Parse(row["Id"].ToString());
       CreditRequired = int.Parse(row["CreditRequired"].ToString());
       Name = row["Name"].ToString();
   }
}

public class RequirementMap : ClassMapping<Requirement>
{
    public RequirementMap()
    {
        Table("Requirements");
        Id<int>(x => x.Id, m => { m.Column("Id"); m.Generator(Generators.Native); });
        Property<int>(x => x.CreditRequired, m => { m.Column("CreditRequired");});
        Property<string>(x => x.Name, m => { m.Column("Name"); });
    }
}

这是我的逻辑

[Serializable]
public class RequirementBC 
{
    ISession session = NHibernateHelper.GetCurrentSession();
    public void UpdateRequirement(int reqId, string newName, int creditsRequired)
    {
         session.BeginTransaction();

            var req = session.QueryOver<Requirement>().Where(x => x.Id == reqId).SingleOrDefault<Requirement>();
            var old = session.QueryOver<Requirement>().Where(x => x.Name == newName && x.Id != reqId).SingleOrDefault<Requirement>();
            if (old != null)
                throw new Exception("Requirement with that name already exists");
             req.Name = newName;
             req.CreditRequired = creditsRequired;
             session.Update(req);
             session.Flush();
         session.Transaction.Commit();     
    }
}

获取当前会话的逻辑

public static ISession GetCurrentSession()
{
    HttpContext context = HttpContext.Current;
    ISession currentSession = context.Items[CURRENT_NHIBERNATE_SESSION_KEY] as ISession;

    if (currentSession == null)
    {
        currentSession = sessionFactory.OpenSession();
        context.Items[CURRENT_NHIBERNATE_SESSION_KEY] = currentSession;
    }
    if (currentSession.Connection.State == System.Data.ConnectionState.Closed)
    {
        currentSession = sessionFactory.OpenSession();

    }
    if (!currentSession.IsConnected)
    {
        currentSession = sessionFactory.OpenSession();

    }
    if (!currentSession.IsOpen)
    {
        currentSession = sessionFactory.OpenSession();

    }
    if (currentSession.IsDirty())
    {
        currentSession.Clear();

    }

    return currentSession;
}

从我在这个论坛和其他人的搜索中,遇到过这种情况的人得到了一个例外或者另一个,但是在我自己的案例中没有例外,这使得问题难以追查。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

  • 不需要对会话已跟踪的对象调用Update()。 (而Update()不一定会执行UPDATE SQL语句。)
  • 您在哪里打开并提交交易?
  • 您的GetCurrentSession()看起来很奇怪 - 到目前为止,我还没有觉得需要让所有这些检查我的“get-current-session”方法。特别是if-dirty-then-clear看起来很奇怪。我通常希望能够在一个工作单元内多次调用“get-current-session”,而不会产生将任何更改丢弃到远处的副作用。

答案 1 :(得分:0)

如果您正在使用交易,则不必刷新会话。另外,我不确定您用于事务的语法。如果我这样做,它将是这样的:

public void UpdateRequirement(int reqId, string newName, int creditsRequired)
{
    using(ISession session = NHibernateHelper.GetCurrentSession())
    {
        using(ITransaction transaction = session.BeginTransaction())
        {
            var req = session.QueryOver<Requirement>().Where(x => x.Id == reqId).SingleOrDefault<Requirement>();
            var old = session.QueryOver<Requirement>().Where(x => x.Name == newName && x.Id != reqId).SingleOrDefault<Requirement>();

            if (old != null)
                throw new Exception("Requirement with that name already exists");

            req.Name = newName;
            req.CreditRequired = creditsRequired;

            transaction.Commit();     
        }
    }
}