2013-04-11 49 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