我正在尝试更新记录,并在context.SaveChanges();
该物业的名称'是对象关键信息的一部分,不能修改。
以下是更新功能的代码:
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; }
我搜索了类似的问题,但找不到任何可行的解决方案。
答案 0 :(得分:33)
请参阅yildizm85对此问题的回答:entity framework not working on table without identity column
&#34;实体框架需要主键才能从数据库生成模型。如果表上没有主键,它只会选择不可为空的列作为连接的主键,并且实体将是只读的。&#34;
查看您的EAT_SourceNames
对象,看来没有主键字段,因此实体框架正在使用列&#39; name&#39;作为复合键的一部分,这意味着它是只读的。
解决方案是将主键字段添加到EAT_SourceNames
,然后添加您的姓名&#39;字段将不再是主键的一部分。
答案 1 :(得分:7)
今天我也发生了同样的事。我使用旧记录的ID设置新实体的ID,错误消失了。
//This checks whether there's 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;
}
答案 2 :(得分:3)
我认为更新文本主键的唯一方法是使用以下内容。
我认为最佳做法是使用&#34;功能性&#34;首要的关键。主键的目的只是唯一地标识一行。
context.Database.ExecuteSqlCommand("UPDATE Table SET [Name] = {0} WHERE [Name] = {1}", nameProperty, oldNameProperty);
答案 3 :(得分:2)
可能name
是您的EAT_SourceNames
实体的部分或完整主键。
您无法修改对象的PK,是EF的限制(请参阅此thread)。
答案 4 :(得分:2)
这是正确的解决方法。
您必须从EAT_SourceNames中取消选中Name的实体键。
您可以按照以下步骤进行操作。
答案 5 :(得分:0)
重点是你使用一个对象。 “name”属性标识对象,这就是您无法修改它的原因。 解决方案是使用SQL语句(UPDATE)修改表中的值并重新加载上下文。 此致。