Öğrenme etkinliği olarak bir blog motoru yazıyorum. Orada bir sürü blog motoru var biliyorum, ama benimle ...Nasıl davranılır NHibernate.NonUniqueObjectException
Bir mülke sahip bir BlogPost varlığım var Etiketler, bu etiketle ilişkili bir IList etiketidir. BlogPost.SetTags (string) yöntemi dizeyi böler, belirtilen etiket adında yeni Tag nesneleri oluşturur ve bunları listeye ekler. BlogPost.AddTag (string tagName) için de aynı.
Gerçekleştirmek istediğim, "foo" adında bir etiket varlığının zaten var olduğu ve veritabanında kalıcı olduğu BlogPost.AddTag ("foo") adını verdiğimde, nHibernate yalnızca bunu fark ediyor ve gönderiyi gönderiyor mevcut etiketle.
BlogRepository.Save() yönteminde, Etiketler listesindeki her etiketin zaten mevcut olup olmadığını kontrol ediyorum. Değilse, bir TagRepository.Save (tag) çağrısı ile kaydedin;
Sorun, aşağıdaki örnek kodda, bir hata alıyorum "NHibernate.NonUniqueObjectException: aynı tanımlayıcı değeri olan farklı bir nesne zaten oturum ile ilişkili: etiketi 1: CMS.Core. Model.Tag "varolan bir etiketi kullanarak bir BlogPost nesnesini sürdürmeye çalıştığımda. Sadece yeni etiketler kullanan bir BlogPost nesnesine devam ettiğimde, bunlar oluşturulur ve her şey yolunda.
Not Ayrıca, TagName bp_Tags tablosu için veritabanındaki birincil anahtar olarak kullanıyorum. Tablo yalnızca benzersiz Etiket adlarını depoladığında bir tamsayı veya GUID PK kullanmak gereksiz görünüyordu.
Benim nHibernate yapılandırma gibi görünüyor:
<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: etiketi 1, varlığın: Aynı tanımlayıcı değerle farklı nesne zaten oturum ile ilişkili bulunmuştur Bariliant.CMS.Core.Model. Etiket
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
... yanlış yaptığını ve nasıl bunu düzeltmek için çalışıyorum ne
herhangi bir düşünce?
Sorunun iç ve varolan etiketlerin listesi için olsun yolu geliyor inanıyoruz:
Bu blog gönderme size ayrıntılı bir açıklama verecektir Yeni olanı ve mevcut olanı yeni BlogPost nesnesine nasıl atadığınızla karşılaştırın. BlogRepository.Save(); kodunun yayınlanması iyi bir fikir olur. Sorunun farkına varmamız için tüm bunların gerçekleştiği yöntem. – tolism7