C# LinqToSql:无法插入记录

C# LinqToSql:无法插入记录,c#,linq-to-sql,C#,Linq To Sql,我正在学习Linq到SQL。我想添加一条记录,但在InsertOnSubmit()上出现异常: 无法在上执行创建、更新或删除操作 “表(GuestbookEntry)”,因为它没有主键 但是我的数据库有一个主键 这是我的密码: [Table(Name = "GuestbookEntry")] public class GuestbookEntry { [Column(DbType = "int not null, IsPrimaryKey=true, IsDBGenerated=true

我正在学习Linq到SQL。我想添加一条记录,但在
InsertOnSubmit()
上出现异常:

无法在上执行创建、更新或删除操作 “表(GuestbookEntry)”,因为它没有主键

但是我的数据库有一个主键

这是我的密码:

[Table(Name = "GuestbookEntry")]
public class GuestbookEntry
{
    [Column(DbType = "int not null, IsPrimaryKey=true, IsDBGenerated=true")]
    public int Id { get; set; }
    [Column]
    public string Name { get; set; }
    [Column]
    public string Message { get; set; }
    [Column]
    public DateTime DateAdded { get; set; }
}

public class GuestbookContext : DataContext
{
    public Table<GuestbookEntry> GuestBookEntries;
    //public Table<Order> Orders;
    public GuestbookContext(string connection) : base(connection) { }
}

...

private GuestbookContext dbGuestbook = new GuestbookContext("GuestBookConnection");

...

dbGuestbook.GuestBookEntries.InsertOnSubmit(entry);
dbGuestbook.SubmitChanges();
[表(Name=“GuestbookEntry”)]
公共客房
{
[列(DbType=“int not null,IsPrimaryKey=true,IsDBGenerated=true”)]
公共int Id{get;set;}
[专栏]
公共字符串名称{get;set;}
[专栏]
公共字符串消息{get;set;}
[专栏]
public DateTime DateAdded{get;set;}
}
公共类留言簿上下文:DataContext
{
公共餐桌客房;
//公众餐桌秩序;
公共留言簿上下文(字符串连接):基本(连接){}
}
...
私人留言簿上下文数据库留言簿=新留言簿上下文(“留言簿连接”);
...
dbGuestbook.GuestBookEntries.InsertOnSubmit(条目);
dbGuestbook.SubmitChanges();
你能告诉我怎么了吗


谢谢。

看起来您需要为表定义主键

当我学习LINQ to SQL时,我遵循的最简单方法是专门使用LINQ to SQL设计器,而不是尝试手动编写数据模型。这样,我只需确保数据库模式的设置完全符合我的要求。一旦我做到了这一点,就只需遵循以下步骤:

  • 在服务器资源管理器中创建到数据库的数据连接
  • 从解决方案资源管理器上下文菜单创建一个新的LINQ到SQL类项(添加…|数据| LINQ到SQL类。将其命名为GuestBook.dbml
  • 将表从数据连接拖到设计器。我假设您的一个表名为GuestBookKentry
  • 然后,在代码中执行插入:

    using (GuestBookContext dc = new GuestBookContext())
    {
        GuestBookEntry entry = new GuestBookEntry();
        ...
        (populate required fields, BUT DON'T TOUCH THE PRIMARY KEY FIELD)
        ...
        dc.GuestBookEntries.InsertOnSubmit(entry);
        dc.GuestBookEntries.SubmitChanges();
    }
    

    u确保填充了
    entry
    ?主键始终在表上,而不是在数据库上。为了执行linq操作,必须在表中定义主键。是的,填充了条目。但不是Id,因为它应该由数据库生成。是的,我的意思是表有主键。表有主键吗数据库中的密钥?是SQL Server Management Studio中显示的主键,您可以在“约束”下看到它吗?它确实有主键。这是我确定的第一件事。它是标识主键吗?在调用insert之前,您可能没有设置它,它是标识主键。我想您可能需要将isPrimaryKey从数据库中拉出dbType=“”部分。自从linqtoSql退休后,我已经转移到实体框架,但我认为这是它自己的事情。请参阅:我没有看到IsPrimaryKey设置,我们希望类似这样:[Column(dbType=“int not null”,IsPrimaryKey=true,IsDBGenerated=true]