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

Entity framework 如何在服务器端创建和存储(自跟踪)实体对象?,entity-framework,entity,self-tracking-entities,Entity Framework,Entity,Self Tracking Entities,我正在尝试使用Entity framework 4.0和自跟踪实体实现以下目标: 1) 客户端应用程序通过提供ISBN号从服务器请求一本书 2) 服务器对其数据库执行查询,以查看该书是否已存在 3a)如果该书在数据库中,它将返回该书 3b)如果该书不在数据库中,它将查询Amazon的信息,提取所需的属性,创建一本新书,将其存储在数据库中,并将其返回给客户端 现在,3b)是问题所在。。。我找不到有关如何在服务器端创建实体对象(一本书)、将其添加到上下文并将其存储在数据库中的任何信息。我尝试过各种方

我正在尝试使用Entity framework 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实体的键是ISBN,它是一个最大长度为13的字符串。 StoreGeneratedPattern设置为“无”

作者实体的键是Id,这是一个Guid。 StoreGeneratedPattern是标识

例外消息是: 无法将值NULL插入到“Id”列、表“BookBrowser.dbo.Authors”中;列不允许为NULL。insert失败。语句已终止

但既然StoreGeneratedPattern被设置为Identity,就不应该自动创建Id值吗

谢谢,
Peter

看来问题在于我将Guid与StoreGeneratedPattern=Identity结合使用作为键

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


显然,SQL server无法生成GUID…

您可以使用StoreGeneratedPattern=Identity,但基于edmx生成的SQL脚本在描述主键(GUID)时不包含newid()。您可以在生成的sql脚本中手动执行此操作。”BookId唯一标识符不为空
默认的newid()。因此id值将自动创建GUID。

实际上,服务器可以使用StoreGeneratedPattern=Identity生成id。在db优先的老项目中,这非常有效。但在我目前的项目中,即代码优先,我遇到了同样的问题。