Каков наилучший способ установки свойства навигации с единственным идентификатором в 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 , оставшиеся по умолчанию, не соответствуют тому, что находится в базе данных. Для того, что вы сейчас делаете, это не имеет значения, но это может иметь значение на более позднем этапе.


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

Используйте метод мутатора, чтобы изменить защищенное свойство для идентификатора:

public class MyEntity
{
    public virtual int Id { get; set; }
    public virtual MySecondEntity SecondEntity { get; set; }

    [ForeignKey( "SecondEntity" )]
    protected virtual int? MySecondEntityId { get; set; }

    public void SetSecondEntityId( int? id )
    {
        MySecondEntityId = id;
    }
}



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