【问题标题】:Fluent Nhibernate Automap one to many orphaned recordsFluent Nhibernate Automap 一对多孤立记录
【发布时间】:2011-04-06 19:07:29
【问题描述】:

我的问题是,当我从一对多关系中删除一个对象时,子记录会变成孤立的,而不是被删除。我不确定这是我设置域模型的方式,还是我在自动映射配置期间没有设置某些内容。 Appraisal -> 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>()});

            }

【问题讨论】:

    标签: fluent-nhibernate nhibernate-mapping automapping


    【解决方案1】:

    我认为,由于您的 DefaultCascade 设置为 SaveUpdate(),因此您需要将 HasMany 关系(ShortlistedMentors)覆盖为 Cascade.AllDeleteOrphan。所以它看起来像这样:

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

    我实际上并没有编译它,所以它可能并不完美。

    【讨论】:

    • 我已经尝试过了,但是当我什至尝试向 SHortlistedMentors 集合添加条目时出现以下错误“拥有 cascade="all-delete-orphan" 的集合不再被拥有者引用实体实例:Poco.Appraisal.ShortlistedMentors"
    • 此错误消息可能意味着您在不应该出现的地方覆盖您的集合引用。请参考以下 2 篇文章,看看他们是否可以为您解决此问题:herehere
    • 在发布这篇文章之前,我已经阅读了第一篇文章,我正在按照哈希建议的方式使用 . Clear() 并再次添加任何新元素,但我仍然收到错误。
    • 我想我可能需要查看您的单元测试。此外,您可能希望在修改后的映射的新问题下发布此内容。
    • 我没有对这个项目进行单元测试,我知道这是我应该做的事情,但是这个项目是关于学习 Nhib + Fluent + CastleWindsor 我不想在那里再考虑另一个概念,直到我有了抓住了最初的堆栈。到目前为止,我将创建另一个问题,其中包含更新的详细信息,谢谢 Cole
    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多