1

スキーマ内の EF5 と null 以外の文字列に関して、ちょっとした謎が浮かび上がりました。たとえば、次の単純なユーザー テーブルがあるとします。

CREATE TABLE Users
(
   UserID INT PRIMARY KEY NOT NULL IDENTITY(1,1),
   UserName VARCHAR(50) NOT NULL,
   UserFirst VARCHAR(50) NULL,
   UserLast VARCHAR(50) NULL
)

...そして、それを表す POCO クラスを作成します。これはすべてうまくいきます。データを取得して作成することはできますが、更新によって深刻な問題が発生します。特定のユーザーの名を更新したいとします。

User user = new User { UserID = 12345 };
context.Users.Attach(user);
user.FirstName = "SomethingElse";
context.SaveChanges();

これはうまくいくはずです。アタッチ後、null 非許容UserNameは null です。これは問題ないはずです-変更しようとしているわけではなく、変更検出は値が変更されていないと述べています。ただし、 を呼び出すと、が無効であるSaveChangesことを示す DB 検証例外がスローされます。UserName

したがって、これから、2つの質問:

  1. 私はひどく間違ったことをしていますか?エンティティ フレームワークに関する私の理解には欠陥があると信じています。
  2. プロパティによる変更状態が保存時に使用されないのはなぜですか? は承知しcontext.Configuration.ValidateOnSaveEnabledていますが、単純に検証をオフにすることは有効な答えではないと思います。私が頼ることができる別の同様のオプションはありますか?
4

1 に答える 1

2

ユーザーを更新したいと言っていますが、コード例では、ID が 12345 の新しいユーザーを作成し、それをアタッチしています。コードが行っていることは、まったく新しいエンティティを作成し、null 不可のフィールドを null のままにして、エラーをスローするデータベースに保存しようとすることです。

ID 12345 の既存のユーザーを取得するつもりですか? 次に、新しいエンティティを作成する代わりに、データベースからそのエンティティをフェッチして、プロパティを更新する必要があります。

User user = context.Users.First(u => u.UserID == 12345);
user.FirstName = "SomethingElse";
context.SaveChanges();

編集

アタッチ後に FirstName プロパティを変更すると、EF はエンティティ全体をダーティとしてマークし、すべてを更新しようとします。

FirstName だけを更新する場合は、コードを変更する必要があります (関連する SO 投稿から、単一の列を更新する方法):

  var user = new User { UserID = 12345, FirstName = "SomethingElse" };
  using (var db = new MyEfContextName())
  {
    context.Users.Attach(user);
    context.Entry(user).Property(x => x.FirstName).IsModified = true;
    context.SaveChanges();
  }
于 2012-09-25T13:22:07.377 に答える