Свойства навигации с SQL/щеголь


Я хочу иметь тот же опыт с SLQ с/щеголеватый для моей свойства навигации просто, как в рамках организации. Но я не уверен, что SQL-запрос я должен использовать. Как вы видите, каждый субъект ресурса называет "выберите запрос" для получения это родственный язык. Значит ли это повлиять на производительность? Может быть, я должен использовать один "запрос соединения"?

public class Resource  {
    public int Id { get; set; }
    public string Name { get; set; }
    public int LanguageId { get; set; }
    public Language Language = {
         return connection.Query<Language>("select * from Language where Id = @Id", new { Id = LanguageId }).First();
    }
}

public class Language {
    public intId { get; set; }
    public string Name { get; set; }
    public List<Resource> Resources => {
         return connection.Query<Resource>("select * from Resource where LanguageId = @LanguageId", new { LanguageId = Id }).ToList();
    }  
}


602
1
задан 31 января 2018 в 12:01 Источник Поделиться
Комментарии
1 ответ

Сущности имеют зависимость к connection объект, который каким-то образом, доступных для них. Если это один экземпляр, вы можете испытывать технические трудности при чтении лиц и их вложенных сущностей в одном заявлении. Но это не самое главное.

Наиболее важное возражение заключается в том, что эти "активные" свойства навигации всегда будет рождать в Н + 1 проблема: для каждого элемента вы тянете из базы данных по 1 запрос, вы будете вызывать n запросы для получения связанных с ними данных. Что, безусловно, влияет на производительность и это зависит от объема данных, будь то серьезный.

Этот эффект усугубляется тем, что данные не хранятся в родительских сущностей: каждый раз при обращении к свойству навигации выполняется запрос.

Есть несколько вещей, чтобы рассмотреть, когда дело доходит до воспроизведения объекта-системы (эф) поведение в отношении свойства навигации. Эф нагрузки организаций в контексте, который реализует тож карте: т. е. каждая запись базы данных будет представлен ровно в C# объект. Пользу от этого трудно воспроизвести:


  1. Если одна сущность изменяется, эти изменения отражаются там, где лицо ссылается. Кроме того, изменения однозначны: никаких "равных" субъектов, когда старые ценности. (Вам, наверное, только для чтения данные, так что это не может повлиять на вас).

  2. Возможность выполнения операций, основанных на равенство ссылок. Например, в вашем случае, группировка ResourceС помощью Language произведем групп, имеющих 1 пункт, потому что язык объекта не равны (конечно, можно избежать с помощью LanguageIdно все-таки это понял).

  3. Эф можно проанализировать отношения исправление при загрузке сущностей: загрузка ресурсов и языки отдельно в одном контексте будет автоматически заполнять свойства навигации. Ваш код никогда не будет этого делать.

Примечание: щеголь это мульти сопоставления не облегчить первые два пункта, потому что он также создает отдельные экземпляры объектов для "равных" субъектов.

Так что в целом, я бы этого не сделал. Я хотел бы получить данные отдельно и выполнять какую-то "исправить отношения" вручную.

2
ответ дан 2 февраля 2018 в 02:02 Источник Поделиться