Как создать и сохранить (самообследуемый) объект объекта на стороне сервера? - PullRequest
0 голосов
/ 07 августа 2010

Я пытаюсь добиться следующего с помощью 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?

Спасибо, Питер

Ответы [ 2 ]

0 голосов
/ 15 июля 2011

вы можете использовать StoreGeneratedPattern = Identity, но сгенерированный sql-скрипт на основе вашего edmx не содержит newid () в описании первичного ключа (GUID)Вы можете сделать это вручную в сгенерированном скрипте sql.'Уникальный идентификатор BookId NOT NULL DEFAULT newid ()'.Таким образом, значение идентификатора создаст GUID автоматически.

0 голосов
/ 08 августа 2010

Похоже, проблема заключалась в том, что я использовал Guid в качестве ключа в сочетании с StoreGeneratedPattern = Identity.

Когда я устанавливаю для StoreGeneratedPattern значение None и создаю свой собственный Guid с помощью Id = Guid.NewGuid (),проблема исчезла.

Судя по всему, сервер SQL не может генерировать Guids ...

...