Объект EF6, противоположный

71
8

Скажем, сначала используется код EF6. Скажем, у нас есть простая связь между двумя таблицами. Если у пациента один врач.

class Patient
{
[Key]
public int id { get; set; }
public string Name { get; set; }
[ForeignKey("Doctor")]
public int DoctorId { get; set; }
public virtual MedicalPersonel Doctor { get; set; }
}
class MedicalPersonel
{
[Key]
public int id { get; set; }
public string Name { get; set; }
}

Существует функция Include (строка) для загрузки Доктора, когда я загружаю пациента. Но что было бы наоборот, если я не хочу загружать доктора, если у доктора есть какие-то большие поля, такие как изображения?

Благодарю!

спросил(а) 2020-04-04T00:13:28+03:00 6 месяцев, 3 недели назад
1
Решение
59

Что забавная часть о ленивой загрузке, вы не будете загружать Doctor если не получите доступ к собственности. Чтобы быть абсолютно уверенным, что вы не "случайно" ленитесь загружать все, что можете

Удалите все virtual ключевое слово из свойств, которые вы никогда не хотите лениво загружать.

Когда вы создаете свой контекст, отключите ленивую загрузку для этого экземпляра DbContext:

myContext.Configuration.LazyLoadingEnabled = false;

Я думаю, что вариант номер 2 будет предпочтительнее, так как это оставляет вам выбор, когда включать/отключать ленивую загрузку.

ответил(а) 2020-04-04T00:32:33.877517+03:00 6 месяцев, 3 недели назад
41

Удалите виртуальное ключевое слово, которое будет Lazy загружать объект. Затем, когда вы получаете объект Patient из базы данных, он не будет загружать связанный объект Doctor, если вы не включите его в запрос. https://msdn.microsoft.com/en-gb/data/jj574232.aspx

ответил(а) 2020-04-04T00:13:28+03:00 6 месяцев, 3 недели назад
41

В качестве документов вы можете использовать следующий код в своем DbContext.OnModelCreating:


modelBuilder.Entity<Patient>()
.Ignore(p => p.Doctor);

ответил(а) 2020-04-04T00:13:28+03:00 6 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема