2013-04-11 46 views
1

我有兩個表。文檔表和版本表。兩者都是標識,除了版本表有一個ID字段和一個documentID字段。文檔表有一個documentId字段。Linq更新數據庫,主鍵

我可以正確地找到文檔,但我找不到版本表信息,因爲我在其中填充的ID試圖在id字段而不是documentId字段上找到它。

public ActionResult ApproveDocument(int id = 0) 
    { 
     IPACS_Document ipacs_document = db.IPACS_Document.Find(id); 
     IPACS_Version ipacs_version = db.IPACS_Version.Find(id); 

     ipacs_version.dateApproved = System.DateTime.Now; 
     ipacs_version.approvedBy = User.Identity.Name.Split("\\".ToCharArray())[1]; 

     ipacs_document.dateApproved = System.DateTime.Now; 
     ipacs_document.approvedBy = User.Identity.Name.Split("\\".ToCharArray())[1]; 
     ipacs_document.revision = ipacs_version.revision; 

     db.SaveChanges(); 

     return RedirectToAction("Approve"); 
    } 

所以ipacs_document正確發現,因爲ID在11件作品通過。但ipacs_version找不到任何內容,因爲它試圖找到id 11而不是documentId 11

+0

我不熟悉.Find(id)方法......你是寫它還是自動生成的? – Colin 2013-04-11 17:51:50

+0

它是自動生成的。 – 2013-04-11 17:54:07

回答

1

如果你想知道如何使用Find(DbSet <>)從事composite keys ...

查找方法需要一個對象數組作爲參數。使用複合主鍵工作 時,請傳遞由逗號 分隔的鍵值,並按照它們在模型中定義的相同順序傳遞。

http://msdn.microsoft.com/en-us/library/gg696418(v=vs.103).aspx

db.IPACS_Version.Find(id, documentid); // mind the order 

而對於什麼想法沒有更復雜的記住,你總是可以使用LINQ查詢,Where例如

db.IPACS_Version.Where(x => x.Id == id && x.DocumentId == docid && x.Flag == true); 

注:您可以使用queryWhere(不管你的實體是如何製造) -
但如果你keys沒有正確設置(基於評論) - 我勸你不要這樣。取而代之的是快速修復的 ,請確保您的表格,pk-s設置爲應該 - ,因爲這是必不可少的。然後你可以看到哪個查詢最適合你(或者 只是使用查找,如果這就是你需要的)。

+0

Hrm我想知道數據庫是否沒有正確設置。版本表只有一個主鍵,它附加到ID。那麼詹斯可能就是 – 2013-04-11 18:01:02

+0

。只需上傳您使用的實體 - 我也可以幫助您。 – NSGaga 2013-04-11 18:02:03

+0

如果它的代碼優先 - 我假設它是,但不一定是當然的。 – NSGaga 2013-04-11 18:05:54