Каков наилучший способ установки свойства навигации с единственным идентификатором в Entity Framework?

c# entity-framework entity-framework-6 navigation-properties

Вопрос

У меня есть следующие enitities:

public class MyEntity
{
    public virtual int Id { get; set; }
    public virtual MySecondEntity SecondEntity { get; set; }
}
public class MySecondEntity
{
    public virtual int Id { get; set; }
    ...
    some properties here
    ...
}

Я не хочу создавать свойство MySecondEntityID, чтобы иметь чистую модель.

Мне нужно установить myEntity.MySecondEntity по его идентификатору, но я не хочу запрашивать MySecondEntity из БД.

Можно ли это сделать без создания свойства MyEntity.MySecondEntityID и без загрузки всего объекта MySecondEntity или даже без каких-либо запросов db?

Принятый ответ

Можно создать объект MySecondEntity вручную и прикрепить его к контексту как к неизмененному объекту.

var secondEntity = new MySecondEntity();
secondEntity.Id = id;
context.MySecondEntities.Attach(secondEntity);
entity.SecondEntity = secondEntity;

Чтобы это было просто, я проигнорировал возможность того, что объект MySecondEntity с тем же ключом уже существует в контексте. Чтобы выполнить эту работу, вы должны проверить локальные объекты (например, путем поиска context.MySecondEntities.Local ) и повторно использовать объект, если найдете его там.

Примечание. EF не имеет никакого способа узнать, что другие свойства secondEntity , оставшиеся по умолчанию, не соответствуют тому, что находится в базе данных. Для того, что вы сейчас делаете, это не имеет значения, но это может иметь значение на более позднем этапе.


Популярные ответы

Для сущности Framework 5 или более поздней версии вы можете добавить Id рядом с навигационным свойством, которое будет автоматически заполнено, когда объект загрузится из db.

public class MyEntity 
{
    public int Id { get; set;} 

    public int MySecondEntityId { get; set;} 
    public virtual MySecondEntity MySecondEntity { get; set;} 
} 

Установка MySecondEntityId достаточно для создания отношения (после сохранения). Таким образом, вам не нужно загружать фактический объект из db.

Если у вас есть ключ с нулевым значением, достаточно сделать допустимым значение NID для навигации.

public class MyEntity 
{
    public int Id { get; set;} 

    public int MySecondEntityId { get; set;} 
    public virtual MySecondEntity MySecondEntity { get; set;} 
} 



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему