지금:
//banan get in previous session and banan.VersionObject = 1
using (var session = factorySession.OpenSession())
{
banan.Name = "diffrent";
session.Update(banan);
session.Flush();//exception if version not equal 1
}
//banan.VersionObject still equals 1
내 hbm 구성 :
<class xmlns="urn:nhibernate-mapping-2.2" dynamic-insert="true" dynamic-update="true" optimistic-lock="version" name="LittleNHibernateProject.Model.FatherBanan, LittleNHibernateProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="FatherBanan">
<cache region="FatherBanan" usage="read-write" />
<id name="Id" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="increment" />
</id>
<version generated="always" name="VersionObject" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
<column name="VersionObject" not-null="true" default="1" />
</version>
<any id-type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" meta-type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="WifeBanan">
<meta-value value="MotherBanan" class="LittleNHibernateProject.Model.MotherBanan, LittleNHibernateProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<meta-value value="FatherBanan" class="LittleNHibernateProject.Model.FatherBanan, LittleNHibernateProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<column name="Banan_Type" />
<column name="Banan_Id" />
</any>
<property name="Name" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Name" />
</property>
<property name="Variety" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Variety" />
</property>
</class>
두 가지 경로가 있습니다.
데이터베이스에서 트리거를 사용하십시오. 하지만 모든 엔터티에 대한 트리거 수동 생성을 원하지 않습니다.
코드에서 다음과 같습니다.
using (var session = factorySession.OpenSession())
{
banan.Name = "diffrent";
session.Update(banan);
session.Flush();//exception if version change
banan.VersionObject = banan.VersionObject + 1;
session.Update(banan);
session.Flush();
}
그리고 이것은 (2 경로) 나쁜 습관처럼 보입니다. 어떤 제안이나 연습? 아니면 내 config.hbm이 올바르지 않습니까?
예, 데이터베이스의 모든 테이블에 트리거를 만듭니다.
var factory = new DbConfigurationFactory();
var factorySession = factory.CreateFactory();
var allClasses = factorySession.GetAllClassMetadata();
//ReCreate triggers in database
foreach (var metadata in allClasses)
{
var tableName = (metadata.Value as NHibernate.Persister.Entity.AbstractEntityPersister).TableName;
using (var session = factorySession.OpenSession())
{
var commandText = $@"
DROP TRIGGER IF EXISTS {tableName}trigger ON public.{tableName};
CREATE TRIGGER {tableName}trigger
BEFORE UPDATE ON public.{tableName}
FOR EACH ROW EXECUTE PROCEDURE update_version_func();
";
var command = session.Connection.CreateCommand();
command.CommandText = commandText;
command.ExecuteNonQuery();
}
}
그리고이 작업 :
FatherBanan banan = null;
FatherBanan banan2 = null;
using (var session = factorySession.OpenSession())
{
banan = session.Get<FatherBanan>((long)4);
//banan.VersionObject = 1
}
using (var session = factorySession.OpenSession())
{
banan2 = session.Get<FatherBanan>((long)4);
//banan2.VersionObject = 1
}
using (var session = factorySession.OpenSession())
{
banan.Name = "PPPP";
session.Update(banan);
session.Flush();
//banan.VersionObject = 2
}
using (var session = factorySession.OpenSession())
{
var newBanan = session.Get<FatherBanan>((long)4);
//newBanan.VersionObject = 2
}
using (var session = factorySession.OpenSession())
{
banan2.Name = "PPPP2";
session.Update(banan2);
session.Flush();//exception banan2.VersionObject = 1 when in database VersionObject = 2
}
여기서 update_version_func는 다음과 같습니다.
CREATE OR REPLACE FUNCTION public.update_version_func()
RETURNS TRIGGER AS
$BODY$
BEGIN
NEW.VersionObject = NEW.VersionObject +1;
return NEW;
END
$BODY$
LANGUAGE plpgsql;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다