Fluent nhibernate Fluent Nhibernate自动映射一对多孤立记录

Fluent nhibernate Fluent Nhibernate自动映射一对多孤立记录,fluent-nhibernate,nhibernate-mapping,automapping,Fluent Nhibernate,Nhibernate Mapping,Automapping,我的问题是,当我从一对多关系中删除一个对象时,子记录会变成孤立的,而不是被删除的。我不确定这是我设置域模型的方式,还是在自动映射配置期间没有设置。评估->入围者关系是发生孤立记录的位置。它们出现在ShortlistMentor表和ShortListQuestionResponse中。我所期望的是,当我从关系中删除一个ShortlistMentor时,它会从ShortlistMentor表中删除,并且ShortListQuestionResponse表中的条目也会删除 public class

我的问题是,当我从一对多关系中删除一个对象时,子记录会变成孤立的,而不是被删除的。我不确定这是我设置域模型的方式,还是在自动映射配置期间没有设置。评估->入围者关系是发生孤立记录的位置。它们出现在
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; }
公共类评估:基本实体
{
公众评价()
{
ShortlistedMentors=新列表();
ApprovedMentor=新用户();
学院=新的参考数据();
}
#区域基本属性
公共虚拟布尔决策{get;set;}
公共虚拟系统.DateTime?ApprovedDate{get;set;}
public virtual System.DateTime?接受日期{get;set;}
公共虚拟系统.DateTime?CompletionTargetDate{get;set;}
公共虚拟字符串拒绝原因{get;set;}
公共虚拟IList短名单入口{get;set;}
公共虚拟用户ApprovedMentor{get;set;}
公共虚拟参考数据学院{get;set;}
}

public类ShortlistedMentor:BaseEntity
{
公共虚拟用户指南{get;set;}
公共虚拟IList ShortListQuestionResponses{get;set;}
}
公共类ShortListQuestionResponse:BaseEntity
{
公共虚拟字符串注释{get;set;}
公共虚拟整数分数{get;set;}
公共虚拟参考数据问题{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())
)
.Mappings
(
m=>
m、 自动映射。添加
(
自动装配(cfg)
.Override(map=>{map.HasManyToMany(x=>x.SICCodes).Table(“SICRefDataToClient”);})
.IgnoreBase()
.Conventions.Add(新StringColumnLengthConvention()、新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>()});

            }
ProjectToUpdate.evaluation.ShortlistedMentors.Clear();
foreach(Request.Form[“ProjectToEdit.evaluation.ShortlistedMentors”].Split(',')中的var userId)
{
var user=_membershipService.GetUser(Convert.ToInt16(userId));
ProjectToUpdate.evaluation.ShortlistedMentors.Add(new ShortlistedMentor(){Mentor=user,ShortListQuestionResponses=new List()});
}

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

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

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

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

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

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

我已经尝试过了,但是当我甚至尝试向SHortlistedMentors集合添加条目时,我得到了以下错误:“一个带有cascade=“all delete orphan”的集合不再被拥有的实体实例引用:Poco.evaluation.SHortlistedMentors”此错误消息可能意味着您正在覆盖不该覆盖的集合引用。请参阅这两篇文章,看看它们是否可以为您解决此问题:在发布此消息之前,我已经阅读了第一篇文章,我正在按照哈希的建议使用.Clear()清除集合并且再次添加任何新元素,但我仍然得到了错误。我想我可能需要看一下你的单元测试。你也可能想用修改后的映射将其发布在新问题下。我不是在单元测试这个项目,我知道我应该做些什么,但这个项目是关于学习Nhib+Fluent+CastleWindsor的,我不想做在我掌握了最初的堆栈之前,这里还有一个概念。我将创建另一个问题,其中包含更新的详细信息,感谢ColeI,到目前为止我已经尝试过了,但是当我甚至尝试向SHortlistedMentors集合“A collection with cascade=”all delete orphan添加条目时,我出现了以下错误“已不再被所属实体实例引用:Poco.evaluation.ShortlistedMentors“此错误消息可能意味着您正在覆盖不该覆盖的集合引用。请参阅这两篇文章,看看它们是否可以为您解决此问题:在发布此消息之前,我已经阅读了第一篇文章,我正在按照哈希的建议使用.Clear()清除集合。”并且再次添加任何新元素,但我仍然得到了错误。我想我可能需要看一下你的单元测试。你也可能想用修改后的映射将其发布在新问题下。我不是在单元测试这个项目,我知道我应该做些什么,但这个项目是关于学习Nhib+Fluent+CastleWindsor的,我不想做在我掌握了最初的一堆之前,这里还有另一个概念。我将创建另一个问题,其中包含更新的细节,谢谢你,科尔