Сложная модель для нескольких таблиц (получить и вставить) - PullRequest
0 голосов
/ 16 мая 2011

Сначала я использую код и платформу сущностей.

У меня есть Registration сущность, которая имеет несколько свойств других моделей:

public class Registration
    {
        public int ID { get; set; }
        public int OrganizationID { get; set; }
        public Address RegAddress { get; set; }
        public ContactInformation RegContactInformation { get; set; }
        public string Signature{ get; set; }        
    }

С этой настройкой у меня есть модели Address и ContactInformation. Когда я сохраняю регистрацию, она работает так, как я ожидал. База данных с 3 таблицами (Registration, Address и ContactInformation). С Registration, имеющим FK для двух других.

Однако, когда я пытаюсь получить регистрацию из моей базы данных, используя EF:

    DBConnections dbConnections = new DBConnections();

    var registrations = from r in dbConnections.PlayerRegistrations
                        where r.OrganizationID == orgID
                        select r;

Адрес регистрации и Registration.ContactInformation равны нулю. Как я могу сделать эту работу?

1 Ответ

2 голосов
/ 16 мая 2011

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

Ленивая загрузка

Ленивая загрузка обеспечит вам автоматическую загрузку связанных объектов, но сгенерирует дополнительные запросы к базе данных. Связанная сущность или связанная коллекция будут загружены при первом обращении к свойству. Чтобы использовать отложенную загрузку, вы должны пометить все свойства навигации в объекте как virtual (также отложенная загрузка или создание прокси-сервера не должны быть отключены - это разрешено по умолчанию). Ленивая загрузка работает, только если контекст, используемый для загрузки основного объекта, все еще жив. Чтобы разрешить отложенную загрузку, вы должны изменить свою сущность:

public class Registration
{
    public int ID { get; set; }
    public int OrganizationID { get; set; }
    public virtual Address RegAddress { get; set; }
    public virtual ContactInformation RegContactInformation { get; set; }
    public string Signature{ get; set; }        
}

Стремительная загрузка

Стремительная загрузка определит, какое отношение должно быть загружено вместе с вашей основной сущностью. Стремительная загрузка определяется методом Include. Вы можете переписать Find as:

var registrations = from r in dbConnections.PlayerRegistrations
                                           .Include(p => p.Address)
                                           .Include(p => p.RegContactInformation)
                    where r.OrganizationID == orgID
                    select r;

Имейте в виду, что стремительная загрузка оказывает большое влияние на количество и форму данных, возвращаемых из базы данных.

Явная загрузка

Явная загрузка позволит вам явно сказать, что некоторые отношения должны быть загружены. Вы даже можете определить некоторые условия для загрузки связанных сущностей, что невозможно с двумя другими методами. Сначала вы должны загрузить основную сущность, а перед удалением контекста вы можете сделать что-то вроде:

context.Entry(registration).Reference(c => c.Address).Load();

Этот метод более полезен для загрузки связанных коллекций.

Выборочная загрузка

Выборочная загрузка означает, что вы будете использовать отдельный запрос для каждого отношения. Это похоже на то, что вы не хотите делать, но для некоторой оптимизации производительности переданных наборов результатов это может быть очень полезно (это решает проблему, связанную с активной загрузкой). Смысл этого метода в том, что если вы используете отдельный запрос для отношения, EF все равно будет правильно заполнять свойства навигации. Этот метод имеет смысл только для загрузки связанных коллекций и работает, только если отложенная загрузка отключена.

...