从模型的成员方法中读取相关数据

Reading related data from a member method of the model

我有一个模型,在导航属性中有一些相关数据,如下所示:

public class Document
{
        [Key]
        public int DocumentId { get; set; }
        public string DocumentName { get; set; }

        public virtual ICollection<DocumentBeneficiary> DocumentBeneficiaries { get; set; }
        public virtual ICollection<DocumentExecutor> DocumentExecutors { get; set; }
        public virtual ICollection<DocumentSuccessor> DocumentSuccessors { get; set; }
}

我了解如何从控制器方法中预先加载这些相关数据,如下所示:

var doc = context.Documents.Include(x => x.DocumentBeneficiaries)

但是,我想做的是在 model 中编写一个成员方法,该方法获取与实体相关的数据,进行一些处理,然后输出一个字符串。像这样:

public class Document
{
     ...
     public string ProcessStuff() {
         //use data in navigation properties here like so:
         foreach (var d in DocumentBeneficiaries) { ... }
     }
}

这是允许的吗?我似乎无法在 google 上找到任何相关信息。它会根据我在调用模型中的方法之前如何在控制器中加载实体来延迟加载相关数据还是急切加载相关数据?

我意识到有些学派认为模型不应该有方法,但其他人则认为将业务逻辑放在模型中是可以的。如果我 我想我可以使它成为一个控制器方法,但如果可能的话,这种方式对我的设计更有意义。抱歉,如果这是一个有点推测性的问题,但我似乎无法找到有关此模式的任何信息。

是的,只要启用延迟加载,它就会在您调用 ProcessStuff 方法时加载 DocumentBeneficiaries,将业务逻辑直接添加到模型中可能不是一个好的设计(我认为),但正如您所说,有些人喜欢,有些人不喜欢。

如果您不使用 Include 提前加载子集合并且启用延迟加载,那么您最终将在执行 ProcessStuff() 时进行额外的数据库访问。使用 Include 预加载您需要的数据,减少数据库往返次数。尽可能减少数据库访问总是更好。

如果延迟加载被禁用,您必须在调用 ProcessStuff() 之前使用 Include