Невозможно выполнить операции создания, обновления или удаления таблицы, так как у нее нет первичного ключа. - PullRequest
20 голосов
/ 10 апреля 2009

Я пытался вставить строку в таблицу с идентификатором столбца RequestID (который также является первичным ключом)

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

Но мой код неизбежно выдает следующую ошибку

Невозможно выполнить операции создания, обновления или удаления для таблицы, так как у нее нет первичного ключа.

несмотря на то, что столбец первичного ключа действительно существует

Вот что я пытался сделать:

  1. Чтобы посмотреть в отладчике значение идентификатора столбца, вставляемого в объектную модель. Это 0
  2. Вставить вручную (с SQL) поддельные значения в таблицу - работает нормально, значения идентичности генерируются, как ожидалось
  3. Чтобы убедиться, что SQLMetal правильно сгенерировал карту таблиц. Все ОК, атрибут первичного ключа сформирован правильно

Тем не менее, ни один из подходов не помог. Что за хитрость, кто-нибудь знает?

Ответы [ 4 ]

31 голосов
/ 13 июля 2009

Я также столкнулся с этой проблемой в своем коде на 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 , в данном случае) уже определен первичный ключ, поскольку Linq не может автоматически найти этот факт, если вы не использовали инструменты linq2sql для вытащить определения вашей базы данных в visual studio.

11 голосов
/ 15 ноября 2010

LINQ не позволяет вставлять данные в таблицу без первичного ключа. Чтобы выполнить вставку данных с таблицей без первичного ключа, вы можете использовать процедуру сохранения или создать запрос и выполнить его с помощью LINQ. Ниже ссылка дает хорошее объяснение того же.

Невозможно выполнить операции создания, обновления или удаления для таблицы (сотрудник), поскольку у нее нет первичного ключа

4 голосов
/ 10 апреля 2009

Удалите таблицу, а затем вставьте ее заново. Перед тем, как сделать это, вы должны убедиться, что рядом с полем находится маленький маленький ключик. Перекомпилируй свой проект и все должно быть в порядке.

То, что вы обновили базу данных, не означает, что файл DBML каким-либо образом автоматически обновляется. Это не извините.

3 голосов
/ 10 апреля 2009

Поскольку у таблицы есть первичный ключ в SQL Server, заново добавьте таблицу в конструктор linq2sql.

Если это не так, вы можете вручную указать, какие свойства являются частью первичного ключа, в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...