Свойство "имя" является частью информации о ключе объекта и не может быть изменено. Основы 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) и перезагрузки контекста.
С уважением.