NHibernate - 更新的代码示例

时间:2011-06-30 14:56:42

标签: nhibernate

我一整天都在努力让我的一个对象用版本保存,但无济于事。请指出我做错了什么,因为我在SaveOrUpdate电话后尝试Merge()Update()Clear()

业务对象:

 public class MappedTest  
{  
    public virtual Guid TestID { get; set; }  
    public virtual int VersionID { get; set; }  
    public virtual byte[] Content { get; set;}  
    public virtual DateTime DateSaved { get; set; }  
}  

映射:

<?xml version="1.0" encoding="utf-8" ?>  
<hibernate-mapping ...>  
 <class name="TestImp.Definition.MappedTest, PythonTest" table="Tests">  
  <id name="TestID" unsaved-value="00000000-0000-0000-0000-000000000000">  
  <generator class="guid"/>  
</id>  
<version name="VersionID" column="VersionID" />  
<property name="Content" column="TestObject" type="BinaryBlob"/>  
<property name="DateSaved" column="Date"/>  


`

实际代码:

using (var session = new Configuration().Configure().BuildSessionFactory().OpenSession())  
        {  
            using (ITransaction transaction = session.BeginTransaction())  
            {  
                if(session.Get<MappedTest>(mappedTest.TestID) == null)  
                {  
                    session.Save(mappedTest);  
                }  
                else  
                {  
                session.Clear();  
                    session.Update(mappedTest);  
                }  
                transaction.Commit();  
            }  
        }`  

感谢。

2 个答案:

答案 0 :(得分:2)

对于插入,请尝试使用:

using (var session = new Configuration().Configure().BuildSessionFactory().OpenSession())  
    {  
        MappedTest mappedTest =new MappedTest();

        using (ITransaction transaction = session.BeginTransaction())  
        {  
            session.SaveOrUpdate(mappedTest);  
            transaction.Commit();  
        }  
    }  

更新:

using (var session = new Configuration().Configure().BuildSessionFactory().OpenSession())  
    {  
        MappedTest mappedTest =session.Get<MappedTest>(..an Id..);
        mappedTest.YourProperty="newValue";

        using (ITransaction transaction = session.BeginTransaction())  
        {  
            session.SaveOrUpdate(mappedTest);  
            transaction.Commit();  
        }  
    }  

如果需要,请尝试使用session.Flush()强制执行数据库操作。

答案 1 :(得分:0)

另一种可能花了我一些时间才意识到并且尚未涵盖在这个线程上:在这种情况下,检查你的映射器是否设置在ReadOnly上。当被要求使用ReadOnly映射器保存或更新时,NHibernate不会告诉任何事情。