23

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、主キー属性は正しく生成されています

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

4

4 に答える 4

33

また、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 ツールを使用してデータベース定義を Visual Studio にプルしない限り、Linq がその事実を自動的に検出しないためです。

于 2009-07-13T17:49:38.803 に答える
13

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

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

于 2010-11-15T09:48:27.027 に答える
4

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

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

于 2009-04-10T14:55:57.950 に答える
3

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

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

于 2009-04-10T14:54:45.783 に答える