0

У меня есть модель, которая имеет некоторые соответствующие данные в навигационных свойствах, например так:связанные Чтение данных из метода члена модели

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) { ... } 
    } 
} 

Возможно ли это? Я не могу найти ничего об этом в google. Будет ли он загружать связанные данные ленивыми и нетерпеливыми в зависимости от того, как я загружаю объект в контроллер до вызова метода в модели?

Я понимаю, что некоторые школы мысли придерживаются того, что модели не должны иметь никаких методов, но другие говорят, что вполне нормально поставить бизнес-логику в модель. Если у есть, я полагаю, что я могу сделать это методом контроллера, но, по возможности, этот способ имеет больше смысла для моего дизайна. Извините, если это несколько умозрительный вопрос, но я не могу найти никакой информации об этом шаблоне.

ответ

1

Да, он будет загружать DocumentBeneficiaries при вызове метода ProcessStuff при условии, что Lazyloading включен, это может быть не очень хороший дизайн (мое мнение), чтобы добавить бизнес-логику непосредственно в модель, но, как вы заявили, есть некоторым, кому это нравится, а кто нет.

Если вы не загрузите дочернюю коллекцию заблаговременно, используя Include и Lazyloading, вы в конечном итоге выполните дополнительные отключения базы данных при выполнении ProcessStuff(). Использование Include pre загружает данные, которые вам нужны, с меньшим количеством посещений базы данных. Всегда лучше делать меньше поездок по базам данных, когда это возможно.

Если Lazyloading отключен, вы должны использовать Include перед вызовом ProcessStuff()