2010-08-07 61 views
0

我想達到以下使用實體框架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模型有關。

我有一個圖書實體和一個作者實體,具有多對多的關係。

圖書實體的密鑰是ISBN,它是最大長度爲13的字符串。 StoreGeneratedPattern設置爲無。

作者實體的密鑰是Id,這是一個Guid。 StoreGeneratedPattern是Identity。

異常消息是: 「不能將NULL值插入列‘ID’,表‘BookBrowser.dbo.Authors’;列不允許空INSERT失敗的語句已終止。」

但由於StoreGeneratedPattern設置爲Identity,是否不應自動創建Id值?

謝謝, 彼得

回答

0

看起來,問題是,我用了一個GUID作爲與StoreGeneratedPattern =識別組合鍵。

當我將StoreGeneratedPattern設置爲None並使用Id = Guid.NewGuid()創建自己的Guid時,問題就消失了。

顯然,SQL服務器無法生成的GUID ...

+0

實際上,服務器可以使用StoreGeneratedPattern = Identity生成ID。在一個較早的以db-first爲首的項目中,這很好。但在我目前的代碼優先項目中,我遇到了同樣的問題。 – HiredMind 2011-12-16 18:41:54

0

可以使用StoreGeneratedPattern =身份,但基於您的EDMX不`噸含有NEWID()在描述主鍵(GUID)生成的SQL腳本。你可以在生成的sql腳本中手動執行此操作。 'BookId uniqueidentifier NOT NULL DEFAULT newid()'。所以id值會自動創建GUID。