0

私はこの単純なコードを持っています:(値を更新)

列「c」を更新しようとしています

 using (MaxEntities ctx = new MaxEntities())
            {
                aa orders = (from order in ctx.aa
                             select order).First();
                orders.c = 22;
                ctx.SaveChanges();
            }

これは表です:

CREATE TABLE [dbo].[aa](
    [a] [int] NULL,
    [b] [int] NOT NULL,
    [c] [int] NOT NULL
) ON [PRIMARY]

および内部の値: ここに画像の説明を入力してください

しかし、私は例外を受け取ります:

プロパティ'c'はオブジェクトのキー情報の一部であり、変更できません。

ここに画像の説明を入力してください

EFは初めてです。

どんな助けでも大歓迎です。

4

4 に答える 4

6
The property 'c' is part of the object's key information and cannot be modified.

そのため、編集することはできません。idIDが指定されたキーとして列を追加する必要があるかもしれません

于 2012-06-16T08:40:34.280 に答える
2

別の回答で説明されているように、EFはすべてのエンティティを一意に識別する必要があります。データベースにPKがない場合、EFはいくつかのキーを推測します。キーは固定されていると見なされるため、EFcがキーの一部として推測された場合(および、ヌル不可の非バイナリ列をすべて使用するために推測された場合)、その値を変更することはできません。さらに、EFは主キーのないすべてのテーブルを読み取り専用として取得cするため、デザイナでキーから削除してc値を変更した場合でも、を実行すると別の例外が発生しますSaveChanges

2番目の例外の理由は、EFがモデルとデータベースを記述する方法にあります。EFがキーを推測したとき、それはエンティティの説明とコンテキストの内部ニーズのためだけに行われ、データベースの説明のためには行われませんでした。EFが変更を保存しようとすると、データベースの説明からUPDATEステートメントが作成され、実際のデータベースPK列に関する情報がないと、更新する正しいレコードを識別できません(EFのすべての更新は単一のレコードにのみ影響します-EFチェックROWCOUNT)。これは、EFをだまし、そのデータベースの説明を更新することで解決できます=テーブルの説明の一部の列を主キーとして説明します。これは複数の問題につながります:

  • データベースに一意の列が必要です。そうでない場合、このメソッドは機能しません。
  • この変更を追加するには、EDMXを手動で(XMLとして)編集する必要があります
  • 変更が削除されるため、データベースからモデルを更新するためにデフォルトのMSEDMXデザイナーを使用しないでください。

簡単なアドバイス:主キーを持つデータベーステーブルを使用するか、EntityFrameworkを使用しないでください。

于 2012-06-16T15:24:06.757 に答える
1

ここに主キーがありません。テーブルに主キーを追加すると、機能します。

于 2012-06-16T08:45:44.310 に答える
1

PK がまったくない場合、EF はすべてのフィールド/列をキー情報の一部として使用すると思います。@SteveWilkesによる理由の良い説明があります。しかし、あなたのエンティティはどのように見えますか? もう 1 つの可能性は、これが外部キーである場合、関連付けが別のエンティティ内にあるため、プロパティがないことです。

編集

これは私に考えさせました。そのようなものを作成しない場合でも、PK のないレガシー テーブルで作業しなければならない状況が発生します。ビューはどうですか?EF はマッパーです。そのレコードを一意に識別する必要があるため、このキーを推測して定義します。はい、ストアド プロシージャを使用できますが、ハッキングXMLしてテーブル定義からキーを削除することもできますか?

AND EDIT AGAIN これを投稿した後、@Ladislav Mrnka がすでに同様のアイデア (EF をだまし、そのデータベースの説明を更新する) を言っていることがわかりました。クイック Google は、明確な指示が記載されたこのブログを入手しました。

Close the model designer in Visual Studio if it is still open and re-open the .edmx file in an XML editor
Find the edmx:StorageModels -> Schema -> Entity Container -> EntitySet element that refers to the      table in question
On the EntitySet element, rename the store:Schema attribute to Schema
Remove the store:Name attribute altogether
Remove the opening and closing DefiningQuery tags and everything in between them
Save and close the .edmx file

しかし、本当にPKが嫌いな人はいますか? IDを追加できませんか?

于 2012-06-16T13:59:07.277 に答える