2009-04-22 9 views
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 
     } 
    } 
+0

그 코드 조각은 중복을 삽입합니까? 좀 더 설명해 주시겠습니까? –

+0

아니요,이 코드는 아닙니다. GetByTagName 호출/검사를 제거하면됩니다. 내가 찾고있는 방법은 nHibernate가 메소드에 전달 된 Tag 객체의 Id 필드를 수정하는 방법이다. out 매개 변수는 아니지만 Save 메서드가 반환 된 후 새 Tag를 만들면 tag.Id가 0에서 0으로 변경됩니다. 태그가 이미 존재하는 경우 (즉, FindOrInsert 유형의 메소드를 구현하는 경우) 동일한 작업을 수행하고 싶습니다. –

답변

1

'out 매개 변수'에 대한 언급이 적합하지 않다고 생각합니다. 객체는 여전히 동일한 인스턴스이지만 NH은 저장 될 때 ID를 생성 된 ID로 업데이트했습니다.

나는 당신이 예제에서하고있는 것처럼 태그를 먼저 가져와야한다고 생각한다. 당신이 원하는 경우, 호출자는 올바른 ID가 나는 당신의 질문은 매개 변수에 관한 생각하고 그들이 자 NHibernate에 어떻게 취급하지 않는

tag.id = existingTag.id; 

을 볼 수 있습니다. 이 재료가 어떻게 작동하는지에 대해 좋은 근거를 얻으려면 this article을 읽으십시오.

관련 문제