Linq更新数据库,主键

时间:2013-04-11 17:48:49

标签: c# linq

我有两张桌子。文档表和版本表。除了版本表具有ID字段和documentID字段之外,两者都是相同的。文档表有一个documentId字段。

我可以正确找到该文档,但我找不到版本表信息,因为我填充的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被正确找到,因为传入11的id有效。但ipacs_version找不到任何内容,因为它试图找到id 11而不是documentId 11

1 个答案:

答案 0 :(得分:1)

如果您想知道如何使用Find(DbSet<>)来吸引composite keys ...

  

Find方法将对象数组作为参数。工作时   使用复合主键,传递以逗号分隔的键值   并按照它们在模型中定义的顺序相同。

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设置为他们应该 -   因为那是必不可少的。然后你可以看到哪个查询最适合你(或者   只需使用查找,如果这就是你所需要的。)