我的模型中有两个实体,它们之间存在一对多的关系
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中实现此功能?
答案 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)
这样,回报就是我想要的,性能也一样。