0

エンティティ フレームワーク 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 値は自動的に作成されるべきではないでしょうか?

ありがとう、ピーター

4

2 に答える 2

0

問題は、キーとして Guid を StoreGeneratedPattern = Identity と組み合わせて使用​​したことだったようです。

StoreGeneratedPattern を None に設定し、Id = Guid.NewGuid() を使用して独自の Guid を作成すると、問題はなくなりました。

どうやら、SQL サーバーは Guid を生成できません...

于 2010-08-07T20:00:34.343 に答える
0

StoreGeneratedPattern=Identity を使用できますが、edmx に基づいて生成された SQL スクリプトには、主キー (GUID) の記述に newid() が含まれていません。これは、生成された SQL スクリプトで手動で行うことができます。'BookId uniqueidentifier NOT NULL DEFAULT newid()'. したがって、id 値によって GUID が自動的に作成されます。

于 2011-07-14T20:01:54.077 に答える