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

时间:2018-07-24 22:25:03

标签: c# entity-framework entity-framework-6

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

play.api.mvc.Result

这很好用,但是为了优化代码并限制模型,我只想公开分析中的最后一个过程,如下所示:

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

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

如何在ModelBuider中实现此功能?

1 个答案:

答案 0 :(得分:0)

我启发了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)

这样,回报就是我想要的,性能也一样。