Я использую Entity Framework 2.0.1, и у меня возникла проблема, которая работала нормально в версиях EF до 2.x.
Если я выбираю объект и включаю свойство в выборку и хочу обновить это свойство, я должен обновить ссылку на объект, а не Id, ссылающийся на объект, чтобы EF распознал и сохранил изменение.
Вот пример.
Ranking.RankTypeId - это внешний ключ для RankType.RankTypeId. Я выбираю и включаю свойство RankType.
public Ranking GetRankingById(int rankingId)
{
using (var context = new BestNetDatabaseContext())
{
var rankings = context.Rankings.AsQueryable();
var foundRanking = rankings.Include(x => x.RankType).FirstOrDefault(x => x.RankingId == rankingId);
if (foundRanking == null)
throw new RankingNotFoundException();
return foundRanking;
}
}
Если я хочу обновить Ranking.RankType, я должен выбрать и получить экземпляр объекта RankType и установить его.
ranking.RankType = _rankTypeService.GetRankTypeById(1);
То, что я хотел бы сделать (и делал в течение многих лет), это просто установить Id.
ranking.RankTypeId = 1;
Я присоединяю объект к контексту и устанавливаю состояние «грязный» перед сохранением изменений (этот код работал в предыдущих версиях EF CORE).
public void UpdateRanking(Ranking ranking)
{
using (var context = new MyDatabaseContext())
{
context.Rankings.Attach(ranking);
context.Entry(ranking).State = EntityState.Modified;
//ranking.RankTypeId IS correctly set to 1 at this point
context.SaveChanges();
}
}
Если я не использую оператор включения, я могу установить Id, и EF распознает изменение и обновит базу данных. Кажется, он просто игнорирует обновление Id, когда я включаю свойство. Мысли?