나는 학습 운동으로 블로그 엔진을 쓰고있다. 거기에 블로그 엔진이 많이 있지만, 나와 함께 곰이 ...피하는 방법 NHibernate.NonUniqueObjectException
나는 그것과 관련된 태그의 IList라는 속성을 가진 BlogPost 엔터티를 가지고있다. BlogPost.SetTags (string) 메서드는 문자열을 분할하고 지정된 태그 이름으로 새 Tag 객체를 만든 다음 목록에 추가합니다. BlogPost.AddTag (string tagName)과 동일합니다.
나는 "foo"라는 태그 엔티티가 이미 존재하고 데이터베이스에 유지되는 BlogPost.AddTag ("foo")를 호출 할 때 nHibernate가이를 인식하고 게시물을 와이어 화합니다. 기존 태그와
BlogRepository.Save() 메서드에서 태그 목록의 각 태그가 이미 있는지 확인합니다. 그렇지 않으면 TagRepository.Save (tag) 호출을 사용하여 저장합니다.
문제는 다음 예제 코드에서 "NHibernate.NonUniqueObjectException : 동일한 식별자 값을 가진 다른 개체가 이미 세션 : 태그 1, 엔터티 : CMS.Core와 연결되어 있습니다. Model.Tag "를 사용하여 기존 태그를 사용하여 BlogPost 객체를 유지하려고합니다. 새 태그 만 사용하는 BlogPost 객체를 유지하면 생성되고 모든 것이 정상입니다.
참고 데이터베이스의 기본 키로 TagName을 사용하여 bp_Tags 테이블을 사용하고 있습니다. 테이블에 고유 한 태그 이름 만 저장하는 경우 정수 또는 GUID PK를 사용하는 것은 불필요한 것으로 보입니다.
내 자 NHibernate 구성 보이는 같은
<class name="CMS.Core.Model.Tag,CMS.Core" table="bp_Tags">
<id column="TagName" name="TagName" type="String" unsaved-value="">
<generator class="assigned" />
</id>
</class>
<class name="CMS.Core.Model.BlogPost,CMS.Core" table="bp_Content">
<id name="Id" column="Id" type="Int32" unsaved-value="0">
<generator class="native"></generator>
</id>
<property name="SubmittedBy" column="SubmittedBy" type="string" length="256" not-null="true" />
<property name="SubmittedDate" column="SubmittedDate" type="datetime" not-null="true" />
<property name="PublishDate" column="PublishDate" type="datetime" not-null="true" />
...
<bag name="_tagsList" table="bp_Tags_Mappings" lazy="false" cascade="all">
<key column="Target_Id" />
<many-to-many class="CMS.Core.Model.Tag,CMS.Core" column="TagName" lazy="false" />
</bag>
NHibernate.NonUniqueObjectException : 태그 1 엔티티 : 동일한 식별자 값을 다른 개체가 이미 세션과 연관 Bariliant.CMS.Core.Model. 태그
BlogPost post, post2;
using (UnitOfWork.Start())
{
post = BlogPostFactory.CreateBlogPost("test post", "test body");
post.Publish();
BlogRepository.Save(post);
UnitOfWork.Current.Flush();
post.SetTags("tag 1, tag 2");
BlogRepository.Save(post);
UnitOfWork.Current.Flush();
}
using (UnitOfWork.Start())
{
post2 = BlogPostFactory.CreateBlogPost("test post2", "test body");
post2.Publish();
BlogRepository.Save(post2);
UnitOfWork.Current.Flush();
post2.AddTag("tag 1");
BlogRepository.Save(post2); // throws
... 내가 잘못을하고 해결 방법을하는 무슨을에
어떤 생각?
나는 문제가 내부이며 기존 태그의 목록을 얻을 방법에서 유래 믿습니다
이이 블로그 게시물은 당신에게 자세한 설명을 제공합니다 새 BlogPost 객체와 비교하고 기존 BlogPost 객체에 기존 객체를 할당하는 방법 BlogRepository.Save()의 코드를 게시하는 것이 좋습니다. 이 모든 것이 우리가 문제를 발견 할 수 있도록하기 위해서 발생합니다. – tolism7