23

我一直在尝试在具有标识列 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 是否正确生成了表映射。一切OK,主键属性生成正确

然而,这两种方法都没有帮助。什么套路,有人知道吗?

4

4 回答 4

33

我的 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 工具将数据库定义拉入 Visual Studio,否则 Linq 不会自动发现该事实。

于 2009-07-13T17:49:38.803 回答
13

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

无法对 Table(Employee) 执行创建、更新或删除操作,因为它没有主键

于 2010-11-15T09:48:27.027 回答
4

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

仅仅因为您更新了数据库并不意味着 DBML 文件会自动更新。它没有,对不起。

于 2009-04-10T14:55:57.950 回答
3

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

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

于 2009-04-10T14:54:45.783 回答