ASP.Net mvc 3 LINQ to SQL InsertOnSubmit, дублирование первичного ключа - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь немного изучить 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 ]

1 голос
/ 12 мая 2011

Возможные причины:

  • ваш первичный ключ поступает со стороны клиента и привязывается с помощью привязки модели (попробуйте просмотреть ваш запрос с помощью Fiddler или FireBug)
  • ваш первичный ключ не является столбцом идентификатора в базе данных (он не имеет автоматического приращения)
  • есть проблема с вашими сгенерированными классами Linq to Sql (столбец с автоматическим приращением должен иметь ColumnAttribute с AutoSync = AutoSync.OnInsert и IsDbGenerated = true)
0 голосов
/ 12 мая 2011

У вас, похоже, нет 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

...