Невозможно обновить столбец идентификаторов в Entity Framework Core с момента обновления до. Net Core 3.1 - PullRequest
1 голос
/ 30 апреля 2020

После обновления до. Net Core 3.1, одна из моих сущностей выдает ошибку, если я пытаюсь обновить его с ошибкой «не удается обновить столбец идентификации в Entity Framework Core». Это происходит в прикрепленном или отсоединенном состоянии.

Вот мой беглый конфиг

modelBuilder.Entity<OrderStatus>(b =>
            {
                b.ToTable("OrderStatus");
                b.HasKey(e => e.OrderStatusId);
                b.HasKey(e => new { e.CompanyId, e.OrderId }); //CompositeKey
                b.Property(e => e.OrderStatusId).UseIdentityColumn();
            });

Я выбираю сущность и обновляю значение (не OrderStatusId) и вызываю save, и вот когда он взрывается.

var orderStatus = _context.OrderStatus.FirstOrDefault();
orderStatus.Total = 500;
_context.Entry(OrderStatus).State = EntityState.Modified;
await _context.SaveChangesAsync();

Я сталкивался с этим старым потоком не может обновить столбец идентификации в Entity Framework Core , в котором упоминается «исправление» добавления

b.Property(e => e.OrderStatusId).Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Ignore);

Это действительно работает, но я понятия не имею, зачем это нужно. Это единственная таблица в моем приложении, которая, кажется, хочет этого.

К вашему сведению, я ранее работал на EF core 3.0 и пытался обновиться до 3.1.3, но это не имеет значения.

Должен ли я добавить это ко всем моим беглым определениям сейчас?

Предложения приветствуются!

1 Ответ

2 голосов
/ 30 апреля 2020

Это действительно работает, но я понятия не имею, зачем это нужно. Это единственная таблица в моем приложении, которая, кажется, хочет этого.

Должен ли я добавить это во все мои беглые определения сейчас?

Это необходимо только для столбцов идентификации, которые не первичный ключ (PK) таблицы (или Key в EF Core).

Что должно быть редко - вот почему у вас проблема только с этой таблицей.

Но действительно ли вам нужен составной ПК (и какова цель столбца идентификации)? Обратите внимание, что как и для любых активных вызовов, выигрывает последний HasKey (свободный интерфейс EF Core API для определения PK), т.е. здесь

b.HasKey(e => e.OrderStatusId);
b.HasKey(e => new { e.CompanyId, e.OrderId }); //CompositeKey

строка

b.HasKey(e => e.OrderStatusId);

не имеет эффекта Таким образом, по умолчанию имеет право на обновление. Но тогда почему он здесь? Может быть, было намерение иметь идентификационный номер PK и составной альтернативный ключ ? Другими словами, если конфигурация была

b.HasKey(e => e.OrderStatusId);
b.HasAlternateKey(e => new { e.CompanyId, e.OrderId }); //CompositeKey

, то у вас не будет такой проблемы и вам не нужно будет настраивать AfterSaveBehavior.

И если вы действительно хотите составной ПК , затем удалите вводящую в заблуждение строку

b.HasKey(e => e.OrderStatusId);

и используйте решение SetAfterSaveBehavior.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...