2015-12-06 4 views
0

У меня есть два класса: Владелец и Собака. В классе собак есть свойство навигации определяется следующим образом:Entity Framework Настройка навигации по идентификатору Issue

public class Dog { 
    //Other properties 
    public int OwnerId { get; set; } 
    [ForeignKey("OwnerId")] 
    public virtual Owner Owner{ get; set; } 
} 

У меня также есть следующее (пример) метод

public void SetOwnerOfFirstDog(int ownerId) 
{ 
    //var owner = context.Owners.First(e => e.Id == ownerId); 

    var dog = context.Dogs.First(); 
    dog.OwnerId = ownerId; 
    context.SaveChanges(); 
} 

Это все работает, но когда я позже использовать же дб контекст и найдите ту же собаку, что и свойство владельца null. (Когда я использую другой контекст db, он не является нулевым.)

Однако, если я раскомментирую первую строку в методе SetOwnerOfFirstDog, свойство Owner будет правильно установлено. Но, конечно, это дополнительный запрос к базе данных, и я бы хотел его избежать.

Так что мой вопрос: Как я могу убедиться, что свойство Владелец правильно заполнено, когда я смотрю его после того, как я установил владельца Собаки по идентификатору.

Я использую ленивую загрузку.

ответ

1

Вы можете использовать Include загрузить связанные объекты

public void SetOwnerOfFirstDog(int ownerId) 
{  
    var dog = context.Dogs.Include(x => x.Owner).First(); 
    dog.OwnerId = ownerId; 
    context.SaveChanges(); 
} 
+0

Это работает. Я думал, что Include не нужен с ленивой загрузкой. Если вы не возражаете, можете ли вы сказать мне, как включить Владельца, если я создаю новый объект Dog в этом методе вместо того, чтобы находить существующий? – Jens

+0

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

Смежные вопросы