NHibernate многие ко многим сохраняет дублирующиеся данные - PullRequest
0 голосов
/ 16 марта 2012

Я бы хотел сохранить книги с тегами. Моя проблема в том, что один и тот же тег в двух книгах сохраняется дважды.

Мои занятия:

public class Book
{
    public virtual long ID { get; set; }
    public virtual string Title { get; set; }
    protected ICollection<Tag> _Tags = new List<Tag>();
    public virtual ICollection<Tag> Tags { get { return _Tags; } set { _Tags = value; } }
}

public class Tag: IComparable
{
    public virtual long ID { get; set; }
    public virtual string Name { get; set; }

    public override string ToString() { return Name; }
    public virtual int CompareTo(object obj) { return string.Compare(Name, ((Tag)obj).Name); }
    public override int GetHashCode() { return Name.GetHashCode(); }
    public override bool Equals(object obj) { return Name.Equals(((Tag)obj).Name); }
}

Отображение:

<class name="Book" table="Books">
<id name="ID">
  <generator class="identity"/>
</id>
<property name="Title"/>
<set name="Tags" table="BookTags" cascade="all-delete-orphan">
  <key column ="BookID" />
  <many-to-many class="Tag" column="TagID" />
</set>
</class>

<class name="Tag" table="Tags">
<id name="ID">
  <generator class="identity"/>
</id>
<property name="Name"/>
</class>

Мой код:

Book book;

book = new Book() { Title = "C#" };
book.Tags.Add(new Tag() { Name = "Programming" });
book.Tags.Add(new Tag() { Name = "Computer" });
PersistenceManager.Save(book);

book = new Book() { Title = "Android" };
book.Tags.Add(new Tag() { Name = "OS" });
book.Tags.Add(new Tag() { Name = "Computer" });
PersistenceManager.Save(book);

После сохранения я хотел бы иметь три тега в таблице. Теги: программирование, компьютер и Android. На самом деле, компьютер сохраняется дважды. Причина в том, что я использую две разные ссылки с одинаковым значением.

Я устал переопределять CompareTo, GetHashCode и Equals в классе Tag безуспешно. Есть ли возможность предотвратить сохранение значения дважды, если значения разных ссылок совпадают?

1 Ответ

2 голосов
/ 16 марта 2012

Вы не можете дважды создать новый экземпляр Tag с именем «Компьютер» и ожидать, что для каждого значения будет создан один и тот же идентификатор.В вашем коде нет ничего, что сообщало бы nhibernate о том, что эти два тега совпадают.

Попробуйте:

var computerTag = new Tag() { Name = "Computer" });

Book book;
book = new Book() { Title = "C#" };
book.Tags.Add(new Tag() { Name = "Programming" });
book.Tags.Add(computerTag);
PersistenceManager.Save(book);

//At this point (due to your mapping, the computerTag has been persisted
//and it will have an ID.

book = new Book() { Title = "Android" };
book.Tags.Add(new Tag() { Name = "OS" });
book.Tags.Add(computerTag);
PersistenceManager.Save(book);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...