Блудный многодетный не обновляет базу при добавлении потомка - PullRequest
2 голосов
/ 20 августа 2011

Рассмотрим следующие модели / сопоставления

[DataContract]
public class CustomPhrase : ModelBase
{
  private ICollection<EnglishPhrase> translations;

  public CustomPhrase()
  {
    this.translations = new List<EnglishPhrase>();
  }

  [DataMember]
  public virtual string Phrase { get; set; }

  [DataMember]
  public virtual IEnumerable<EnglishPhrase> Translations
  { 
    get
    {
      return this.translations;
    }
  }
}

[DataContract]
public class EnglishPhrase : ModelBase
{
  private ICollection<CustomPhrase> translations;

  public CustomPhrase()
  {
    this.translations = new List<CustomPhrase>();
  }

  [DataMember]
  public virtual string Phrase { get; set; }

  [DataMember]
  public virtual IEnumerable<CustomPhrase> Translations
  { 
    get
    {
      return this.translations;
    }
  }
}

public CustomPhraseMap() : base("Translation_CustomPhrase", "CustomPhraseId")
{
  this.Property(x => x.Phrase);
  this.Set(
    x => x.Translations,
    map =>
      {
        map.Table("Translation_Link");
        map.Key(key => key.Column("CustomPhraseId"));
        map.Access(Accessor.Field);
        map.Cascade(Cascade.All);
      },
    map => map.ManyToMany(c => c.Column("EnglishPhraseId"))
    );
}

public EnglishPhraseMap() : base("Translation_EnglishPhrase", "EnglishPhraseId")
{
  this.Property(x => x.Phrase);
  this.Set(
    x => x.Translations,
    map =>
      {
        map.Table("Translation_Link");
        map.Key(key => key.Column("EnglishPhraseId"));
        map.Access(Accessor.Field);
        map.Cascade(Cascade.All);
      },
    map => map.ManyToMany(c => c.Column("CustomPhraseId"))
    );
}

Если я выполню этот бит кода, сущности будут добавлены в базу данных, но таблица ссылок Translation_Link не обновится.

var customPhrase = new CustomPhrase { Phrase = "Gobble" };
var englishPhrase = new EnglishPhrase { Phrase = "Hello" };
customPhrase.AddTranslation(englishPhrase);
this.customPhraseRepository.Add(customPhrase);

Я не уверен, является ли это проблемой сопоставления или проблемой конфигурации хранилища. Может я добавляю ребенка не вовремя ??

Кто-нибудь еще сталкивался с этой проблемой раньше и смог ее исправить?

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Мне удалось решить эту проблему с помощью транзакции.

  try
  {
    unitOfWork.BeginTransaction();

    var custom = this.customPhraseRepository.FindCustomPhraseByPhrase(customPhrase);
    if (custom == null)
    {
      custom = new CustomPhrase() { Phrase = customPhrase };
      this.customPhraseRepository.Add(custom);
    }

    var english = this.englishPhraseRepository.FindEnglishPhraseByPhrase(englishPhrase);
    if (english == null)
    {
      english = new EnglishPhrase() { Phrase = englishPhrase };
      this.englishPhraseRepository.Add(english);
    }

    custom.AddTranslation(english);
    this.customPhraseRepository.Update(custom);

    unitOfWork.EndTransaction();
  }
  catch (Exception)
  {
    unitOfWork.RollBack();
  }
  finally
  {
    unitOfWork.Dispose();
  }
1 голос
/ 20 августа 2011

Необходимо установить обратное значение ИСТИНА для коллекций с обеих сторон.

...