Свойство "имя" является частью информации о ключе объекта и не может быть изменено. Основы Entity Framework

Я пытаюсь обновить запись, и я получаю это сообщение об ошибке после context.SaveChanges();

Свойство 'name' является частью информации ключа объекта и не может быть изменено.

Вот код для функции обновления:

 if (context.EAT_SourceNames.Any(e => e.name == newSourceName))
 {
    MessageBox.Show("Name already exists in the Database");
 }
 else
 {
    var nameToUpdate = context.EAT_SourceNames.SingleOrDefault(e => e.name == sourceName.name);
    if (nameToUpdate != null)
    {
       nameToUpdate.name = newSourceName;
       context.SaveChanges();
       RefreshDGVs();
     }
 }

Мой класс SourceNames выглядит следующим образом:

    public EAT_SourceNames()
    {
        this.EAT_Sources = new ObservableListSource<EAT_Sources>();
    }

    public string name { get; set; }
    public string version_id { get; set; }
    public string allocation_name { get; set; }

Я искал похожие вопросы, но не нашел никакого рабочего решения.

Ответ 1

См. ответ от yildizm85 на этот вопрос: структура сущности, не работающая над таблицей без столбца идентификации

"Entity Framework требует, чтобы первичный ключ генерировал модель из базы данных. Если в таблице нет первичного ключа, она просто выбирает столбцы с недействительными значениями как конкатенированный первичный ключ, а сущность будет считана/только."

Посмотрев на ваш объект EAT_SourceNames, похоже, что нет поля первичного ключа, поэтому Entity Framework использует имя столбца как часть составного ключа, что означает, что он доступен только для чтения.

Решение состоит в том, чтобы добавить поле первичного ключа в EAT_SourceNames, а затем поле "имя" больше не будет частью первичного ключа.

Ответ 2

То же самое случилось со мной сегодня. Я установил новый идентификатор объекта со старым идентификатором записи, и ошибка исчезла.

//This checks whether there a record with same specific data.
var kayitVarMi = _db.Sorgu.FirstOrDefault(a => a.Serial == sorgu.Serial);

                if (kayitVarMi != null) // If there's
                {
                    sorgu.Id = kayitVarMi.Id; //This one does the trick
                    _db.Entry(kayitVarMi).CurrentValues.SetValues(sorgu);
                }
                else // If not
                {
                    _db.Sorgu.Add(sorgu);
                }

                // This whole block is in a transaction scope so I just check recordability.
                if (_db.SaveChanges() > 0)
                {
                    _sorguKaydedildiMi = true;
                }

Ответ 3

Единственный способ, с помощью которого я могу обновить первичный ключ текста, - это использовать следующее.

Я не считаю, что лучше использовать "функциональный" первичный ключ. Основной целью является просто уникальная идентификация строки.

context.Database.ExecuteSqlCommand("UPDATE Table SET [Name] = {0} WHERE [Name] = {1}", nameProperty, oldNameProperty);

Ответ 4

Вероятно, name является частью или полным Первичным ключом для вашего объекта EAT_SourceNames. Вы не можете изменять объект PK, это ограничение EF (см. Этот поток).

Ответ 5

Дело в том, что вы работаете с объектом. Свойство "name" идентифицирует объект, поэтому вы не можете его изменять. Решение заключается в изменении значения в таблице с помощью оператора SQL (UPDATE) и перезагрузки контекста. С уважением.