2

ADO.NET Entity Frameworkを使用してC#でアプリケーションを開発しています。

Web上の多くの例では、要素をエンティティに追加するために、次のコードが使用されているnewProductと仮定します。Product

context.Products.Add(newProduct);

Addメソッドは、しかし、のメンバーではないProductsので、使用できません。例で使用されているEFはLinqToSQLかもしれません。

ただし、ADO.NETには次の方法がありますAddObject

context.AddObject("Products", newProduct)

そしてそれは動作しますが、私は2つの理由でそれが好きではありません:

1)機能を実装する唯一の手段でない限り、マジックストリングはできるだけ避けようとしています。

2)リターンタイプとしてボイドが発生しますが、インサートが良かったかどうかはどうすれば確認できますか?

私のエンティティを挿入する別の方法があると思います。誰かが助けるかもしれませんか?

4

1 に答える 1

4

1)機能を実装する唯一の手段でない限り、マジックストリングはできるだけ避けようとしています。

contextが(EF <= 4.0)の場合、通常、派生コンテキストに、名前などObjectContextでを表すメンバーが必要です。次に使用できます:ObjectSet<Product>Products

context.Products.AddObject(newProduct);

コンテキストにそのようなセットがない場合でも、別の強く型付けされたオプションがあります。

context.CreateObjectSet<Product>().AddObject(newProduct);

2)リターンタイプとしてボイドが発生しますが、インサートが良かったかどうかはどうすれば確認できますか?

AddObjectINSERTをデータベースに実行することはまったくありません。オブジェクトをAddedobjectContextの状態にするだけです。実際のINSERTは、後で.を呼び出すときに1つのトランザクションで発生しますSaveChanges

それでも、AddObject同じキーを持つ2つのオブジェクトをコンテキストに追加した場合(エンティティにキーの自動生成IDがない場合)、またはその他の理由で失敗する可能性があります。その場合、AddObject通常はコードに重大な問題またはバグがあることを示しているため、キャッチすべきではない例外がスローされます。

SaveChangesを返しますint。ただし、これは、オブジェクトの挿入が成功したことをint示すものではありません。SQLステートメントが実行される前に、オブジェクトコンテキストで状態( INSERTステートメントが発生する)、状態(UPDATEステートメントが発生)、および状態(DELETEステートメントが発生)にあるオブジェクトSaveChangesの数のみがカウントされます。AddedModifiedDeleted

繰り返しますが、SQLステートメント(INSERTなど)のいずれかが成功しなかった場合SaveChanges、例外がスローされます。例外は、クライアント側ですでに問題が発生していることを示している場合もあれば、SQL操作中に問題が発生したことを示している場合もあります。たとえば、INSERTが失敗した場合、例外は、キーを持つ行がすでに存在するためにINSERTが失敗したというメッセージを表示する場合があります。データベースに挿入したい場合、または挿入したいエンティティにnull許容でない列が入力されていない場合など。また、他の多くの例外タイプの中で、同時実行の問題による例外が発生する可能性があります。

SaveChanges考えられる例外をキャッチすることで、成功したかどうかを確認できます。

try
{
    int numberOfObjects = context.SaveChanges();
}
catch (SomeExceptionType e)
{
    // What now?
}

ところで:context.Products.Add(...)あなたが見たのはおそらく(EF> = 4.1)でcontextある例でした。は、Entity Frameworkへの簡略化されたAPIです(これはまだ内部でコアを使用しています)。このAPIでは、新しいエンティティを挿入するメソッドは実際には(のメソッド)と呼ばれ、ではありません。DbContextDbContextObjectContextAddDbSet<T>AddObject

于 2012-04-06T17:16:29.497 に答える