Доступ к полю ForeignKey после создания объекта в Entity Framework - PullRequest
0 голосов
/ 15 марта 2012

При создании нового объекта, если я пытаюсь получить доступ к одному из полей внешнего ключа сразу после создания, я получаю исключение ссылки на объект.Вот код -

        Call call = new Call()
        {
            ....
            StoreID = storeID,    //foreign key of store
            ....
        }
        db.Calls.Add(call);
        db.SaveChanges();
        ....

        // do something with store
        call.Store.Anything();

Это выдает:

Ссылка на объект не установлена ​​для экземпляра объекта.

Поскольку call.Storeне отображается ни на один объект

Обратите внимание, что код работает отлично, если я не пытаюсь получить доступ к объекту Store.Если я перенаправляю пользователя, и вызов загружается с нуля, то доступ к объекту Store работает без проблем.

Как неприятный хак, я попытался

 db.Entry(call).Reload();

, но даже это не помогло

Как сделать объект хранилища доступным сразу после создания?


Модель:

[Table("CALL_LOG")]
public class Call
{
    .....

    [Column("STORE_IID"), Required]
    public int StoreID { get; set; }

    [ForeignKey("StoreID")]
    public virtual Store Store { get; set; }

    .....
 }

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Следующее будет работать, я верю:

db.Entry<Call>(call).Reference("Store").Load()

Это скажет ему загрузить свойство навигации магазина.

1 голос
/ 15 марта 2012

Хорошо, теперь, когда я вижу больше кода, который имеет смысл. Поскольку вы храните идентификатор, вам нужно снова нажать на базу данных, чтобы надуть объект.

Call call = new Call()
{

    ....

    StoreID = storeID,    //foreign key of store

    ....

}

db.Calls.Add(call);

db.SaveChanges();
call = db.Calls.Single(c => c.CallId = call.CallId).Include(c => c.Store);

....

// do something with store

call.Store.Anything();
0 голосов
/ 15 марта 2012

Если я вас правильно понял: 1. вы создаете новый экземпляр Call, как-то не используя экземпляр db (с call = new Call()?), Прежде чем добавить его с этой строкой:

db.Calls.Add(call);

2.Вы получаете NullReferenceException после попытки доступа к свойству Store.

В этом случае может помочь добавление ctor, который инициализирует Store, в класс Call.

public Call()
{
 ...
    this.Store = new Store();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...