Свободное автоматическое отображение Nhibernate от одной до многих осиротевших записей - PullRequest
1 голос
/ 05 апреля 2011

Моя проблема в том, что когда я удаляю объект из отношения один ко многим, дочерние записи становятся осиротевшими, а не удаляются.Я не уверен, настроил ли я свою модель домена, или я что-то не настраиваю во время автоматической настройки карты.Отношение Оценка -> ShortlistedMentor - это место, где происходят потерянные записи.Они встречаются как в таблице ShortlistMentor, так и в таблице ShortListQuestionResponse.Я ожидаю, что когда я удаляю ShortlistMentor из отношения, он удаляется из таблицы ShortlistMentor, а также удаляются также записи в таблице ShortListQuestionResponse.

 public class Appraisal : BaseEntity
{
    public Appraisal()
    {
        ShortlistedMentors = new List<ShortlistedMentor>();
        ApprovedMentor =  new User();
        College =  new RefData();
    }

    #region Primitive Properties

    public virtual bool Decision { get; set; }
    public virtual System.DateTime? ApprovedDate { get; set; }
    public virtual System.DateTime? AcceptedDate { get; set; }
    public virtual System.DateTime? CompletionTargetDate { get; set; }
    public virtual string RejectionReason { get; set; }

    public virtual IList<ShortlistedMentor> ShortlistedMentors { get; set; }

    public virtual User ApprovedMentor { get; set; }

    public virtual RefData College { get; set; }

}

 public class ShortlistedMentor : BaseEntity
{
    public virtual User Mentor { get; set; }
    public virtual IList<ShortListQuestionResponse> ShortListQuestionResponses { get; set; }

}

public class ShortListQuestionResponse : BaseEntity
{
    public virtual string Comment { get; set; }
    public virtual int Score { get; set; }
    public virtual RefData Question { get; set; }

}

Автоматическая настройка карты

.Mappings
(
m => 
m.AutoMappings.Add
(
    AutoMap.AssemblyOf<User>(cfg)
    .Override<Client>(map =>{map.HasManyToMany(x => x.SICCodes).Table("SICRefDataToClient");})
    .IgnoreBase<BaseEntity>()
    .Conventions.Add(new StringColumnLengthConvention(),new EnumConvention(),DefaultCascade.SaveUpdate())
    .Conventions.Add(DefaultLazy.Always())
)

не уверен, что это поможет, но вот как я удаляю элементы из коллекции и добавляю новые

 ProjectToUpdate.Appraisal.ShortlistedMentors.Clear();
            foreach (var userId in Request.Form["ProjectToEdit.Appraisal.ShortlistedMentors"].Split(','))
            {
                var user = _membershipService.GetUser(Convert.ToInt16(userId));
                ProjectToUpdate.Appraisal.ShortlistedMentors.Add(new ShortlistedMentor(){Mentor = user,ShortListQuestionResponses = new List<ShortListQuestionResponse>()});

            }

1 Ответ

1 голос
/ 05 апреля 2011

Я думаю, поскольку ваш DefaultCascade установлен в SaveUpdate (), вам нужно переопределить ваши отношения HasMany (ShortlistedMentors) для Cascade.AllDeleteOrphan.Так что это выглядело бы примерно так:

.Override<Appraisal>(map =>{map.HasMany(x => x.ShortlistedMentors).Cascade.AllDeleteOrphan();})

На самом деле я не скомпилировал это, поэтому он может быть не идеальным.

...