0
저는 블로그/CMS 시스템을 구축하고 있습니다 (재미로, 거기서 사용할 수있는 톤이 있다는 것을 알고 있습니다).
Id (int) 및 TagName (string) 속성 만 가진 간단한 태그 엔터티가 있습니다. 나는 내가 좋아하는 일을 할 수있는 nHibernate 수는 구성 싶습니다 nHibernate에서 중복 데이터를 삽입하는 것을 방지하려면 어떻게해야합니까?
var tag1 = Tag.CreateTag("duplicate tag test"); // Id=0 at this point
var tag2 = Tag.CreateTag("duplicate tag test"); // Id=0 at this point
TagRepository.Save(tag1); // tag1.Id is non-zero
TagRepository.Save(tag2); // tag2.Id should be the same as tag1.Id at this point, but it's not
Assert.AreEqual(tag1, tag2);
내가 저장 (태그)를 룩업 같은 일을 구상하고, 태그가 이미 존재하는 경우, 어떻게 든이 tag1의 값 tag2로 교체합니다. nHibernate는 out 매개 변수로 전달되지 않더라도 매개 변수의 속성을 수정하는 일부 마법을 사용합니다. 누군가가 내게 여기에서 일어나는 일과 내가 원하는 것을하기위한 ths 방법을 고치는 방법을 말할 수 있습니까? 나는 태그 매개 변수에 out 키워드를 사용하지 않아도되도록 노력하고 있습니다.
public override void Save(Tag tag)
{
Tag existingTag = GetByTagName(tag.TagName);
if (null == existingTag)
{
using (ISession session = NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
session.SaveOrUpdate(tag);
transaction.Commit();
}
}
else
{
tag = existingTag; // obviously doesn't impact the caller
}
}
그 코드 조각은 중복을 삽입합니까? 좀 더 설명해 주시겠습니까? –
아니요,이 코드는 아닙니다. GetByTagName 호출/검사를 제거하면됩니다. 내가 찾고있는 방법은 nHibernate가 메소드에 전달 된 Tag 객체의 Id 필드를 수정하는 방법이다. out 매개 변수는 아니지만 Save 메서드가 반환 된 후 새 Tag를 만들면 tag.Id가 0에서 0으로 변경됩니다. 태그가 이미 존재하는 경우 (즉, FindOrInsert 유형의 메소드를 구현하는 경우) 동일한 작업을 수행하고 싶습니다. –