English 中文(简体)
无法对表执行“创建”、“更新”或“删除”操作,因为它没有主键
原标题:
  • 时间:2009-04-10 14:47:27
  •  标签:

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

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

但我的代码不可避免地会出现以下错误

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

尽管主键列确实存在

这就是我试图做到的:

  1. To look in debugger the value of identity column being inserted in object model. It is 0
  2. To insert manually (with SQL) fake values into table - works fine, identity values generated as expected
  3. To assure if SQLMetal has generated table map correctly . All OK, primary key attribute is generated properly

尽管如此,这两种方法都无济于事。有人知道怎么回事吗?

问题回答

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

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

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

删除表,然后重新插入。在执行此操作之前,必须确保字段旁边有一个小键。重新编译你的项目,一切都会好起来的。

仅仅因为您更新了dabase并不意味着DBML文件会以某种方式自动更新。没有,对不起。

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

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





相关问题
热门标签