Это может быть повторяющийся вопрос, но большой поиск слов в названии только принес мне много несвязанных результатов.
У меня есть объект, который примерно настроен так:
public abstract class A
{
public GUID AId { get; set; }
public string SomeProperty { get; set; }
}
public class B : A
{
public string SomeOtherProperty { get; set; }
}
Контекст имеет public DbSet<B> BInstances { get; set; }
для B
объектов.В OnModelCreating
для сопоставления A
установлено значение игнорируется, а B
сопоставляется с таблицей с именем TableB
.
Поле AId
не генерируется автоматически (не поле идентификации), но оно установлено как первичный ключ как в базе данных, так и в отображении.В базе данных поле определяется как ненулевое uniqueidentifier
без значения по умолчанию.
Во время выполнения я загружаю экземпляр B
, используя его ключ (_token
это просто CancellationToken
):
var b = await (dbCtx.BInstances.FirstOrDefaultAsync(e => e.AId), _token));
Затем устанавливается свойство b
, и я пытаюсь сохранить его обратно в базу данных:
b.SomeOtherProperty = "some new text";
await (dbCtx.SaveChangesAsync(_token));
На этом этапе я получаю Нарушение ограничения PRIMARY KEY Ошибка из базы данных, заявив, что значение AId
не может быть вставлено, потому что это будет дубликат.Конечно, идентификатор уже есть в базе данных, я загрузил сущность оттуда, используя идентификатор.По какой-то причине EF генерирует оператор INSERT, а не UPDATE, и я не понимаю, почему.
Когда я проверяю dbCtx.Entry(b).State
, он уже установлен на EntityState.Modified
.Я в растерянности - кто-то может указать, что я делаю не так?У меня никогда не было проблем с обновлением сущностей, но я не использовал EF с первичными ключами GUID (обычно я использую long
первичные ключи).
Я использую EF 6 и .NET Framework 4.7.1.