Другой экземпляр объекта вызывает ошибку при обновленииC#

Место общения программистов C#
Ответить
Anonymous
 Другой экземпляр объекта вызывает ошибку при обновлении

Сообщение Anonymous »

В моем ядре Asp.net Core 9 Web API и Entity Framework у меня есть модельный класс для клиента , который имеет отношения, многие со многими с каналом класса модели .

Код: Выделить всё

public class Client
{
[Key]
public long ID { get; set; }
}

public class Channel
{
[Key]
public long ID { get; set; }
public string? Name { get; set; }
public ICollection? Client { get; set; }
}
< /code>
После миграции база данных имеет структуру новой таблицы, как я ожидаю: < /p>
 
Я могу добавить новые значения, используя ядро ​​Entity Framework. 
Проблема начинается, когда я хочу обновить значения. 
У меня есть API, с точным глаголом put 
, который получает объект клиента как параметр со всеми деталями. Сначала я прочитал объект из базы данных, включая каналы :

Код: Выделить всё

var localClient = await db.Client.AsNoTracking()
.Include(c => c.Channels)
.FirstOrDefaultAsync(model => model.ID == id);
< /code>
Тогда я сопоставляю параметр с данными из базы данных: < /p>
localClient = mapper.Map(client);
, а затем я обновляю каналы , используя значения из параметра:

Код: Выделить всё

localClient.Channels?.Clear();

if (client.Channels != null)
{
var listChannels = client.Channels.ToList();

foreach (Channel ch in listChannels)
{
var l = await db.Channels.Where(c => c.ID == ch.ID).FirstOrDefaultAsync();

if (l != null)
if (localClient.Channels!.Count(c => c.ID == l.ID) == 0)
localClient.Channels?.Add(l);
}
}
Если я осмотрю объект LocalClient , существуют только уникальные каналы и отсутствие дублирования. Когда я хочу сохранить, используя < /p>
db.Attach(client);
< /code>
Я немедленно получаю эту ошибку: < /p>

Экземпляр типа объекта 'канал' не может быть отслеживается, потому что другой экземпляр с То же значение ключа для {'id'} уже отслеживается. При прикреплении существующих сущностей убедитесь, что прикреплен только один экземпляр объекта с заданным значением ключа. Рассмотрите возможность использования 'dbcontextoptionsbuilder.enablessensitividatalogging', чтобы увидеть конфликтующие значения ключей. Я проверил свои старые проекты и использую аналогичный процесс.

Подробнее здесь: https://stackoverflow.com/questions/794 ... hen-update
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»