0

我正在尝试使用实体框架 4.0 和自跟踪实体来实现以下目标:

1) 客户端应用程序通过提供 ISBN 号向服务器请求一本书

2) 服务器在其数据库上执行查询以查看这本书是否已经存在

3a) 如果这本书在数据库中,则返回它。

3b) 如果该书不在数据库中,它将向亚马逊查询信息,提取所需的属性,创建新书,将其存储在数据库中,然后将其返回给客户端

现在,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 实体的 Key 是 ISBN,它是一个最大长度为 13 的字符串。StoreGeneratedPattern 设置为 None。

Author 实体的 Key 是 Id,它是一个 Guid。StoreGeneratedPattern 是身份。

异常消息是:“无法将值 NULL 插入列 'Id',表 'BookBrowser.dbo.Authors';列不允许空值。INSERT 失败。语句已终止。”

但是既然 StoreGeneratedPattern 设置为 Identity,难道不应该自动创建一个 Id 值吗?

谢谢,彼得

4

2 回答 2

0

看起来问题在于我将 Guid 作为 Key 与 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 回答