无法在Table上执行创建,更新或删除操作,因为它没有主键

时间:2009-04-10 14:47:27

标签: linq insert identity

我一直在尝试在具有标识列RequestID(也是主键)的表中插入行

    HelpdeskLog logEntry = new HelpdeskLog { RequestBody = message.Body };
    if (attachment != null)
        logEntry.Attachments = Helper.StreamToByteArray(attachment.ContentStream);
    Database.HelpdeskLogs.InsertOnSubmit(logEntry);

但是我的代码不可避免地会抛出错误

  

无法对表执行创建,更新或删除操作,因为它没有主键。

尽管确实存在主键列

这就是我试图做的事情:

  1. 在调试器中查找正在插入对象模型中的标识列的值。它是0
  2. 手动(使用SQL)将假值插入表中 - 工作正常,标识值按预期生成
  3. 确保SQLMetal是否正确生成了表映射。一切正常,主键属性正确生成
  4. 尽管如此,这两种方法都没有帮助。什么是诀窍,有人知道吗?

4 个答案:

答案 0 :(得分:31)

我的C#代码中也出现了这个问题,并意识到我忘记了IsPrimaryKey的名称:

  [Table (Name = "MySessionEntries" )]
  public class SessionEntry
  {
     [Column(IsPrimaryKey=true)]  // <---- like this
     public Guid SessionId { get; set; }
     [Column]
     public Guid UserId { get; set; }
     [Column]
     public DateTime Created { get; set; }
     [Column]
     public DateTime LastAccess { get; set; }
  }

即使您的数据库表(在本例中为 MySessionEntries )已经定义了主键,也需要这样做,因为除非您使用了linq2sql工具,否则Linq不会自动找到该事实。将数据库定义提取到visual studio中。

答案 1 :(得分:10)

LINQ不允许在没有主键的情况下将数据插入表中。要使用没有主键的表来实现插入数据,您可以使用存储过程或创建查询并使用LINQ执行。下面的链接提供了相同的解释。

Can't perform Create, Update or Delete operations on Table(Employee) because it has no primary key

答案 2 :(得分:4)

删除表格然后重新插入。在执行此操作之前,您必须确保字段旁边有一个小键。重新编译你的项目,一切都应该没问题。

仅仅因为您更新了数据库并不意味着DBML文件会以某种方式自动更新。它没有,抱歉。

答案 3 :(得分:3)

由于该表在SQL Server中具有主键,因此请在linq2sql设计器中重新添加该表。

如果不是这种情况,您可以在设计器上手动配置哪些属性是主键的一部分。