如何在服务器端创建和存储(自我跟踪)实体对象?

时间:2010-08-07 16:18:37

标签: entity-framework entity self-tracking-entities

我正在尝试使用Entity framework 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实体,具有多对多的关系。

图书实体的密钥是ISBN,它是Max length 13的字符串。 StoreGeneratedPattern设置为None。

作者实体的密钥是Id,它是一个Guid。 StoreGeneratedPattern是Identity。

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

但是由于StoreGeneratedPattern设置为Identity,不应该自动创建Id值吗?

谢谢, 彼得

2 个答案:

答案 0 :(得分:0)

看起来问题是我使用Guid作为Key与StoreGeneratedPattern = Identity结合使用。

当我将StoreGeneratedPattern设置为None并使用Id = Guid.NewGuid()创建我自己的Guid时,问题就消失了。

显然,SQL服务器无法生成Guids ...

答案 1 :(得分:0)

您可以使用StoreGeneratedPattern = Identity,但基于您的edmx生成的sql脚本在描述主键(GUID)时不包含newid()。您可以在生成的sql脚本中手动执行此操作。 'BookId uniqueidentifier NOT NULL    DEFAULT newid()'。所以id值会自动创建GUID。