0

У меня есть класс:Поставлен навигация свойство не нагружает

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int UserId { get; set; } 
    public virtual User User { get; set; } 
} 

В User таблице:

Id Name  
1  Tommy 
2  John 

Я создаю объект:

Person P = new Person { Name = "Test", UserId = 1 }; 

я вставляю Person объект в базе данных:

db.Persons.Add(P); 
db.SaveChanges(); 
var user = P.User; 

Проблема в том, что я пытаюсь получить доступ. P.User содержит null. Другие свойства P заполнены должным образом.

Почему?

+0

Не используйте ALLCAPS в заголовках, пожалуйста. – jmoerdyk

+0

Вы установили пользователя? Похоже, вы создаете Личность, но не связываете человека с пользователем - должен ли это делать UserId? У вас также есть ленивое загруженное (виртуальное) свойство nav, возможно, стоит профилировать SQL-сервер, чтобы посмотреть, что он пытается загрузить при доступе к свойству. – Charleh

+0

Да UserId сделает ассоциацию –

ответ

0

Вы должны отметить USERID собственности в качестве внешнего ключа, как:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [ForeignKey("User")] 
    public int UserId { get; set; } 
    public virtual User User { get; set; } 
} 

Как это, структура субъекта будет знать, что ваше имущество UserId должно принадлежать к User собственности.

+0

Я сделал это onModelCreating –

+0

Можете ли вы добавить этот код? – moritzpflaum

0

Я думаю, вам нужно выполнить новый запрос для человека. Запрос Entity Framework insert возвращает только идентификатор нового объекта с помощью SCOPE_IDENTITY(), поэтому связанные объекты не загружаются. Что делать, если вы сделаете это:

var newPerson = db.Persons.Find(P.Id); 
var user = newPerson.User; 
2

Вы должны создать Person следующим образом:

Person p = db.Persons.Create(); 
p.Name = "Test"; 
p.UserId = 1; 

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

+0

Я использую репозиторий и образец работы, не могли бы вы рассказать мне, как я могу включить это? –

+0

Где у вас есть звонок «нового человека»? Должно быть возможным заменить это, я думаю, поскольку репо должно иметь «DbContext» или «DbSet». –

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