ASP.Net mvc 3 LINQ to SQL InsertOnSubmit,主键重复

时间:2011-05-12 09:49:49

标签: exception asp.net-mvc-3 primary-key

我正在尝试学习一些ASP.net MVC 3,我正面临一个非常讨厌的问题。

我有一个非常简单的代码控制器来创建消息。

[HttpPost]
public ActionResult Create(Message message)
{
    if (ModelState.IsValid)
    {
        try
        {
            var db = new BooksDB();
            db.Messages.InsertOnSubmit(message);
            db.SubmitChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View(message);
        }
    }
    return View(message);
}

第一个寄存器的创建正常,但主键为0!?!

当我尝试添加另一条消息时,我有一个例外:

Violation of PRIMARY KEY constraint 'PK_Messages'. Cannot insert duplicate key in object 'dbo.Messages'. The statement has been terminated.

我不明白为什么主键被强制为0 InsertOnSubmit()。它应该自动递增。

视图是使用脚手架生成的,不会为Id字段提交任何内容。

任何想法?

2 个答案:

答案 0 :(得分:1)

可能的原因可能是:

  • 您的主键来自客户端,它正在被模型绑定器绑定(尝试使用Fiddler或FireBug查看您的请求)
  • 您的主键不是数据库中的标识列(它不会自动递增)
  • 你的Linq to Sql生成的类有一个问题(一个自动递增的列应该有ColumnAttribute,AutoSync = AutoSync.OnInsert和IsDbGenerated = true)

答案 1 :(得分:0)

您在相关Identity字段的数据库中似乎没有id个自动生成的值。您不仅必须将字段指定为主键,而且如果您希望自动生成值,则还必须指定该字段:

CREATE TABLE [dbo].[MyTable](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [SomeField] [nvarchar](50) NOT NULL,
    [OtherField] [nvarchar](100) NOT NULL,
    CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
    (
    [id] ASC
    )
)

您也可以在SSMS中将字段设置为标识值