我正在尝试使用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值吗?
谢谢, 彼得
答案 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。