我正在尝试使用实体框架 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 值吗?
谢谢,彼得