Я пытаюсь добиться следующего с помощью 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 и сущность Author с отношением «многие ко многим».
Ключ сущности Book - ISBN, представляющий собой строку с максимальной длиной 13.
Для StoreGeneratedPattern задано значение Нет.
Ключом сущности Автора является Id, который является Guid.
StoreGeneratedPattern - это личность.
Сообщение об исключении:
"Невозможно вставить значение NULL в столбец 'Id', таблица 'BookBrowser.dbo.Authors'; столбец не допускает нулевые значения. INSERT не выполнен. Оператор завершен."
Но поскольку для StoreGeneratedPattern задано значение Identity, не следует ли автоматически создавать значение Id?
Спасибо,
Питер