使用db.Find时有复合主键并且只想使用一个

时间:2017-12-11 22:17:46

标签: c# mysql asp.net-mvc entity-framework find

我有一个名为accounts的表,如下所示:

[Key]
public int SiteID { get; set; }
[Key]
public long AccountID { get; set; }
public string Name { get; set; }
public string AccountCode { get; set; }
public string AccountType { get; set; }

我正在尝试使用Entity Framework在SiteID = 999999的表中显示信息。 我试图使用db.Find方法显示siteID列表,其中siteID = 999999。

我目前的代码: index.cshtml

@Html.ActionLink("Mapping","ConfigureMapping", new { id = item.SiteID })

控制器

 Account account = SiteDatabase.Accounts.Find(id);
 if (account == null)
 {
     return HttpNotFound();
 }
 return View(account);

但是抱怨只收到2个主键中的1个: “传递的主键值的数量必须与实体上定义的主键值的数量相匹配。”

我该怎么做???

2 个答案:

答案 0 :(得分:2)

Find方法返回单个对象,而不是集合。如果您想要SiteID = 999999的所有记录,请使用Where方法获取已过滤的列表。

例如,

List<Account> accountList = SiteDatabase.Accounts.Where(a=>a.SiteID==id).ToList();

其中id的值为999999或其他有效的网站ID值

如果您想要一个项目,可以使用FirstOrDefault作为Find的替代选项

Account account = SiteDatabase.Accounts.FirstOrDefault(a=>a.SiteID==id);

请注意,这将返回第一场比赛。因此,如果您有2条具有相同SiteID值(但不同AccountID)的记录,则它将返回第一个记录,可能不是您要查找的记录。因此,我建议您根据唯一键值(唯一键值组合)获取记录。也许您也可以从ui传递帐户ID并使用它(以及siteId)来获取所需的单一对象。

答案 1 :(得分:0)

您还需要为查找提供另一个键,首先将其添加到actionlink:

@Html.ActionLink("Mapping","ConfigureMapping", new { id = item.SiteID, accountID = item.AccountID })

将参数添加到控制器,然后在查找中使用它:

Account account = SiteDatabase.Accounts.Find(id, accountID);