エンティティ フレームワーク 4.0 と自己追跡エンティティを使用して、次のことを達成しようとしています。
1) クライアント アプリケーションは、ISBN 番号を提供することにより、サーバーから書籍をリクエストします。
2) サーバーはデータベースに対してクエリを実行し、書籍が既に存在するかどうかを確認します。
3a) 本がデータベースにある場合は、それを返します。
3b) 本がデータベースにない場合、Amazon に情報を問い合わせ、必要な属性を抽出し、新しい本を作成してデータベースに保存し、クライアントに返します。
さて、3b) が問題です... サーバー側でエンティティ オブジェクト (本) を作成し、それをコンテキストに追加してデータベースに保存する方法に関する情報が見つかりません。私はあらゆる種類のことを試しました:
public class BookBrowserService : IBookBrowserService {
public Book GetBook(string ISBN) {
using (var ctx = new BookBrowserModelContainer()) {
Book book = ctx.Books.Where(b => b.ISBN == ISBN).SingleOrDefault();
if (book == null) {
book = new Book();
book.ISBN = ISBN; // This is the key
book.Title = "This title would be retrieved from Amazon";
Author author = new Author();
author.Name = "The author's name would be retrieved from Amazon";
book.Authors.Add(author);
ctx.Books.AddObject(book);
ctx.SaveChanges(); // This one always throws an exception...
}
return book;
}
}
}
誰かが私が間違っていることを教えてもらえますか? 問題は EDMX モデルに関連しているようです。
Book エンティティと Author エンティティがあり、多対多の関係があります。
Book エンティティのキーは ISBN で、最大長 13 の文字列です。StoreGeneratedPattern は None に設定されます。
Author エンティティのキーは、Guid である Id です。StoreGeneratedPattern は ID です。
例外メッセージは次のとおりです。「列 'Id'、テーブル 'BookBrowser.dbo.Authors' に値 NULL を挿入できません。列は NULL を許可しません。INSERT は失敗します。ステートメントは終了しました。」
しかし、StoreGeneratedPattern が Identity に設定されているため、Id 値は自動的に作成されるべきではないでしょうか?
ありがとう、ピーター