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

22 linq identity insert

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

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

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

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

尽管确实存在主键列

这就是我试图做的事情:

  1. 在调试器中查看正在插入对象模型中的标识列的值.它是0
  2. 要手动(使用SQL)将伪值插入表中 - 工作正常,可以按预期生成标识值
  3. 确保SQLMetal是否正确生成了表映射.一切OK,主键属性都是正确生成的

然而,这两种方法都没有帮助.什么是诀窍,有人知道吗?

Ste*_*e L 32

我也在我的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; }
  }
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!我的代码看起来有点不同,但是主体是相同的`[global :: System.Data.Linq.Mapping.ColumnAttribute(Storage ="_ ID",DbType ="UniqueIdentifier NOT NULL",IsPrimaryKey = true)]`特技. (2认同)

小智 12

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

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


egl*_*ius 3

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

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