繁体   English   中英

实体框架6一对多引用最后一条记录

[英]Entity Framework 6 one-to-many with a reference to last record

我的模型中有两个实体,它们之间存在一对多关系

public class Analysis : Entity
{
    public virtual IList<Process> Processes{ get; set; }
}
public class Process: Entity
{
     public virtual Analysis Analysis { get; set; }
}

这可以正常工作,但是为了优化代码并限制模型,我只想公开Analysis中的最后一个过程,如下所示:

 public class Analysis : Entity
{
    public virtual Process Process { get; set; }
}
public class Process: Entity
{
     public virtual Analysis Analysis { get; set; }
}

但是我不希望Process属性成为Analysis表中的一列,而是让此属性与该Analysis ID的最后一个Process一起加载。

如何在ModelBuider中实现此功能?

我启发了Slava Utesinov的想法,并创建了一个新的想法以提高性能,他的想法将加载分析中的所有过程。

首先,我创建了一个sql函数以返回最后一个进程

    CREATE FUNCTION UDFGetProcess(   @Id int )   RETURNS int AS
    BEGIN
        declare @rint
        select top 1 @r = id from Process p where p.analysis_id = @id order by CreationDate desc
        return @r
    END

然后我像这样改变了班级

public class Analysis : Entity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public virtual Process Process { get; set; }
}

并更改了模型上下文

modelBuilder.Entity<Process>().HasRequired(x => x.Analysis).WithMany().WillCascadeOnDelete(false);

添加了迁移并将字段的创建更改为此

ALTER TABLE dbo.Analisys ADD Process_Id AS dbo.UDFGetProcess(id)

这样的回报是我的预期和性能是相同的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM