Вероятно, вам потребуется добавить более подробную информацию к вашему вопросу, включая определение сущности и / или конфигурацию типа сущности EF для EntityAttribute
, включая любые атрибуты для сопоставления.Является ли IntValue сопоставленным как FK другому объекту?Это наиболее вероятная причина того, что вы не видите обновлений.
Например, если EntityAttribute выглядит примерно так:
public class EntityAttribute
{
// ... properties, key, etc.
public int IntValue { get; set; }
[ForeignKey("IntValue")]
public virtual IntAttribute MyInt { get; set; }
}
Тогда вы сталкиваетесь с ситуацией, когда есть два способа указать EntityAttributeна новом экземпляре IntAttribute, и немного сценария курица и яйцо.Если запись начинает IntValue с 4 и MyInt с идентификатором 4, это может означать изменение ее на «5», так как либо установите IntValue на 5, либо установите MyInt для объекта с ID = 5. Второй вариант является правильным, когдау вас есть определенный столбец FK:
public int UpdateRank(Guid localId, int rank, Guid entityTypeId)
{
var result = _dbContext.EntityAttribute.Single(en => en.ParentGuid == localId
&& en.EntityAttributeTypeId == entityTypeId);
var myInt = _dbContext.MyInts.Single(x => x.MyIntId == rank);
result.MyInt = myInt;
return _dbContext.SaveChanges();
}
Это предполагает, что FK указывает на ссылочное свойство с именем "MyInt" с сущностью DbSet с именем MyInts.Принятие правильного соглашения об именовании в ваших сущностях для идентификаторов (PK и FK) значительно облегчит понимание вашего кода.
Примечание. Я изменил FirstOrDefault
на Single
.С Linq используйте наиболее ограниченную ожидаемую операцию.Используйте «OrDefault» только в том случае, если вы ожидаете, что строки должны быть доступны или нет, и обрабатываете сценарий, в котором они отсутствуют.Если вы ожидаете 1 строку, используйте «Single», а не «First».«Первое» означает, что я ожидаю многих, но только о первом, и оно всегда должно включать в себя предложение OrderBy
.Это сделано для того, чтобы избежать потенциальных ошибок (обновление неправильной записи, появление исключений NullReference и т. Д.)
Теперь, если вы уверены, что нет ссылки на FK, попробуйте следующее:
public int UpdateRank(Guid localId, int rank, Guid entityTypeId)
{
var result = _dbContext.EntityAttribute.Single(en => en.ParentGuid == localId
&& en.EntityAttributeTypeId == entityTypeId);
result.IntValue = rank;
return _dbContext.SaveChanges();
var test = result.IntValue;
}
Установите точку останова на линии var test = ...
.Какое значение возвращается в test
?Если исходное значение IntValue равно «4», rank равно «5», а test
возвращается как «4», то определенно происходит что-то странное.Если test
возвращается как «5», то база данных в этот момент также должна сообщить «5», и, вероятно, что-то еще сбрасывает значение.С точкой останова в этой строке «test =» после SaveChanges проверьте базу данных с помощью ручного запроса.Если запрос не может быть запущен с включенной точкой останова, то другим подозрением может быть то, что вы работаете в открытой транзакции, и транзакция не фиксируется после этого вызова.Открытая транзакция блокирует выполнение запроса до тех пор, пока область Tx не будет завершена.Для транзакций стандартным действием является откат любых изменений, если не указано зафиксировать.Если он не заблокирован, а в БД отображается «4», но test
показывает «5», я бы внимательно посмотрел, чтобы убедиться, что вы используете Single
, а не FirstOrDefault
, потому что это будет выглядеть как ошибка, когдавы запрашиваете одну запись в БД, а EF выбирает другую.(т. е. вы ожидаете 1 запись, но есть несколько, которые соответствуют критериям.) Использование Single
вызовет исключение в этом случае, в результате будет получена 1 запись, но возвращено несколько.