views:

86

answers:

1

Hi everyone,

I am trying to achieve the following using Entity framework 4.0 and self-tracking entities:

1) The client application request a book form the server by providing an ISBN number

2) The server performs a query on its database to see if the book is already present

3a) If the book is in the database, it returns it.

3b) If the book is not in the database, it will query Amazon for info, extract the required attributes, create a new book, store it in the database, and return it to the client

Now, 3b) is where the problems are... I can't find any information on how I can create an entity object (a book) on the server side, add it to the context and store it in the database. I have tried all sorts of things:

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;
        }
    }
}

Could anyone tell me what I am doing wrong? It looks like the problem is related to the EDMX model.

I have a Book entity and an Author entity, with a many-to-many relationship.

The Book entity's Key is ISBN, which is a string of Max length 13. StoreGeneratedPattern is set to None.

The Author entity's Key is Id, which is a Guid. StoreGeneratedPattern is Identity.

The exception message is: "Cannot insert the value NULL into column 'Id', table 'BookBrowser.dbo.Authors'; column does not allow nulls. INSERT fails. The statement has been terminated. "

But since StoreGeneratedPattern is set to Identity, shouldn't an Id value be created automatically?

Thanks, Peter

A: 

It looks that the problem was that I used a Guid as Key in combination with StoreGeneratedPattern = Identity.

When I set StoreGeneratedPattern to None and create my own Guid using Id = Guid.NewGuid(), the problem is gone.

Apparently, the SQL server cannot generate Guids...

Peter