2010-08-07 16 views
0

Je suis en train de réaliser les objectifs suivants en utilisant le framework 4.0 Entité et entités autovirants:Comment créer et stocker un objet entité (auto-suivi) côté serveur?

1) La demande d'application client un livre forment le serveur en fournissant un numéro ISBN

2) Le serveur effectue une requête sur sa base de données pour voir si le livre est déjà présent

3a) Si le livre est dans la base de données, il le retourne.

3b) Si le livre est pas dans la base de données, il questionnera Amazon pour plus d'informations, extraire les attributs requis, créez un nouveau livre, la stocker dans la base de données, et le retourner au client

Maintenant, 3b) est où les problèmes sont ... Je ne trouve pas d'informations sur la façon dont je peux créer un objet entité (un livre) sur le côté serveur, l'ajouter au contexte et le stocker dans la base de données. J'ai essayé toutes sortes de choses:

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

Quelqu'un pourrait-il me dire ce que je fais mal? Il semblerait que le problème soit lié au modèle EDMX. J'ai une entité Livre et une entité Auteur, avec une relation plusieurs-à-plusieurs.

La clé de l'entité Livre est ISBN, qui est une chaîne de longueur maximale 13. StoreGeneratedPattern est défini sur None.

La clé de l'entité Auteur est Id, qui est un Guid. StoreGeneratedPattern est l'identité.

Le message d'exception est: "Impossible d'insérer la valeur NULL dans la colonne 'Id', table 'BookBrowser.dbo.Authors'; colonne ne permet pas les valeurs NULL échoue INSERT L'instruction a été interrompue..."

Mais étant donné que StoreGeneratedPattern est défini sur Identité, une valeur Id ne doit-elle pas être créée automatiquement?

Merci, Peter

Répondre

0

Il semble que le problème était que je Guid comme clé en combinaison avec StoreGeneratedPattern = identité.

Lorsque j'ai défini StoreGeneratedPattern sur None et créé mon propre Guid en utilisant Id = Guid.NewGuid(), le problème est disparu.

Apparemment, le serveur SQL ne peut pas générer Guids ...

+0

En fait, le serveur peut générer des ID avec StoreGeneratedPattern = Identity. Dans un projet plus ancien qui est db-first, cela fonctionne très bien. Mais dans mon projet actuel qui est le code-premier, j'ai le même problème. – HiredMind

0

vous pouvez utiliser StoreGeneratedPattern = Identity, mais le script SQL généré en fonction de votre edmx doesn`t contiennent newID() dans la description de clé primaire (GUID). vous pouvez le faire manuellement dans le script SQL généré. 'Identifiant unique BookId NOT NULL DEFAULT newid()'. Donc, la valeur de l'identifiant crée automatiquement le GUID.