web-dev-qa-db-ja.com

主キーがないため、テーブルに対して作成、更新、または削除操作を実行できません

ID列RequestID(主キーでもある)を持つテーブルに行を挿入しようとしています

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

しかし、私のコードは必然的に次のエラーをスローします

テーブルには主キーがないため、テーブルに対して作成、更新、または削除操作を実行できません。

主キー列が実際に存在するにもかかわらず

それが私がやろうとしたことです:

  1. デバッガーで、オブジェクトモデルに挿入されているID列の値を確認します。 0です
  2. 手動で(SQLを使用して)偽の値をテーブルに挿入するには-正常に機能し、ID値は期待どおりに生成されます
  3. SQLMetalがテーブルマップを正しく生成したかどうかを確認します。すべてOK、主キー属性は適切に生成されます

それにもかかわらず、どちらのアプローチも役に立ちませんでした。トリックは何ですか、誰か知っていますか?

22
igor

また、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ツールを使用してプルする場合を除いて、Linqがその事実を自動的に検出しないためです。ビジュアルスタジオへのデータベース定義。

32
Steve L

LINQでは、主キーなしでテーブルにデータを挿入することはできません。主キーのないテーブルでデータを挿入するには、ストアドプロシージャを使用するか、クエリを作成してLINQを使用して実行します。以下のリンクは同じことの良い説明を提供します。

主キーがないため、Table(Employee)に対して作成、更新、または削除操作を実行できません

12
rs.emenu

テーブルを削除してから、再度挿入します。これを行う前に、フィールドの横に小さな小さなキーがあることを確認する必要があります。プロジェクトを再コンパイルすれば、すべて問題ないはずです。

Dabaseを更新したからといって、DBMLファイルが何らかの形で自動的に更新されるわけではありません。申し訳ありません。

4
Al Katawazi

テーブルにはSQLServerの主キーがあるため、linq2sqlデザイナでテーブルを再度追加します。

そうでない場合は、デザイナーで手動で主キーの一部となるプロパティを構成できます。

3
eglasius