我的模型在导航属性中有一些相关数据,如下所示:
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)
但是,我想要做的是在模型中编写一个成员方法,该方法获取与实体相关的数据,进行一些处理并输出字符串。像这样:
public class Document
{
...
public string ProcessStuff() {
//use data in navigation properties here like so:
foreach (var d in DocumentBeneficiaries) { ... }
}
}
这是允许的吗?我似乎无法在谷歌上找到任何关于它的东西。是否会在调用模型中的方法之前根据我在控制器中加载实体的方式加载相关数据,而不是依赖于数据?
我意识到有些学派认为模型应该没有方法,但是其他人说可以将业务逻辑放在模型中。如果我有,我想我可以把它变成一个控制器方法,但这种方式对我的设计更有意义。对不起,如果这是一个有点推测性的问题,但我似乎无法找到关于这种模式的任何信息。
答案 0 :(得分:1)
是的,只要启用了Lazyloading,它就会在你调用ProcessStuff方法时加载DocumentBeneficiaries,你可能不是一个好的设计(我认为)将业务逻辑直接添加到模型中,但正如你所说,有一些喜欢它的人和喜欢的人。
如果您未使用Include提前加载子集合并且启用了延迟加载,则在执行ProcessStuff()时最终会导致额外的数据库跳闸。使用Include可以使用较少的数据库往返次数预先加载所需的数据。尽可能减少数据库访问总是更好。
如果禁用了Lazyloading,则必须在调用ProcessStuff()
之前使用Include