保存实体时复制子条目

本文关键字:复制 实体 保存 | 更新日期: 2023-09-27 18:05:42

我在更新实体时得到了子元素的副本。

提交代码:

Report report = _ReportService.GetReport(id);
report.AddDocument(
    new Document
    {
        Extension = qqfile.Substring(qqfile.Length - 3),
        Path = g.ToString(),
        Type = TypeHelper.GetDocumentType(report.Status),
        User = MemberFactory.MemberInfo
    }
);

report.Status = (ReportStatus)((int)report.Status + 1);
_reportRepository.SaveOrUpdate(report);

public class Document : BaseModel
{
    public virtual string Path { get; set; }
    public virtual string Extension { get; set; }
    public virtual DocumentType Type { get; set; }
    public virtual User User { get; set; }
    public virtual Report Report { get; set; }
}
public class DocumentMap : ClassMap<Document>
{
    public DocumentMap()
    {
        Id(x=> x.Id);
        Map(x=> x.Extension);
        Map(x => x.Path);
        Map(x => x.CreateDate);
        Map(x => x.LastModified);
        Map(x => x.Type).CustomType<int>();
        References<User>(x => x.User);
        References<Report>(x => x.Report);
    }
}
public class Report : BaseModel
{
    public virtual Patient Patient { get; set; }
    public virtual ReportStatus Status { get; set; }
    public virtual DateTime AppointmentStart { get; set; }
    public virtual DateTime AppointmentEnd { get; set; }
    public virtual ReportType Type { get; set; }
    public virtual IList<Document> Documents { get; set; }
    public virtual long Kareo_Id { get; set; }
    public Report() 
    {
        this.Status = ReportStatus.New;
        this.Documents = new List<Document>();
    }
    public virtual void AddDocument(Document document)
    {
        document.Report = this;
        this.Documents.Add(document);
    }
}

public class ReportMap : ClassMap<Report>
{
    public ReportMap()
    {
        Id(x => x.Id);
        Map(x => x.CreateDate);
        Map(x => x.LastModified);
        Map(x => x.AppointmentStart);
        Map(x => x.AppointmentEnd);
        Map(x => x.Type).CustomType<int>();
        Map(x => x.Status).CustomType<int>();
        Map(x => x.Kareo_Id);
        References<Patient>(x => x.Patient);
        HasMany<Document>(x => x.Documents)
            .Inverse()
            .Cascade.All();
    }
}

保存实体时复制子条目

尝试将AsSet添加到映射

    HasMany<Document>(x => x.Documents)
        .AsSet()
        .Inverse()
        .Cascade.All();

您需要将IList更改为ICollection并使用System.Collections.Generic.HashSet初始化它。

问题的原因是,您可能添加相同的文档到列表两次,因为它没有保存,它被插入两次到数据库。

将实体映射作为文档映射:你应该加上

References<User>(x => x.User).Cascade.None();

Cascade.None()将停止级联任何更改。

你也可以使用智能感知给你选项,当你写。cascade .

转速2
这应该适用于两个映射

References(x => x. user).Cascade.None();引用(x =>

x.Report) .Cascade.None ();