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 ответа
Решение
Для вставки попробуйте только с:
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()
форсировать операции с базой данных.
Еще одна возможность, которая заняла у меня некоторое время, чтобы осознать и еще не освещена в этой теме: в этом случае проверьте, установлен ли ваш маппер на ReadOnly. NHibernate ничего не сообщает, когда его просят сохранить или обновить с помощью маппера ReadOnly.