使用复合主键在DbSet中查找元素。

31

我有以下的模型并且试图在DbSet中找到一个特定的对象:

public class UserSkill
{
    [Key, Column(Order = 1)]
    public int UserId { get; set; }

    [Key, Column(Order = 2)]
    [ForeignKey("Skill")]
    public int SkillId { get; set; }

    public virtual Skill Skill { get; set; }
}

我尝试了以下两种方法来查找特定的UserSkill对象(我通过ViewBag传递UserSkillsDbSet):

ViewBag.UserSkills.Find(new { WebSecurity.CurrentUserId, item.SkillId })
ViewBag.UserSkills.Find(new UserSkill(WebSecurity.CurrentUserId, item.SkillId))

但在两种情况下,我都遇到了错误:

传递的主键值的数量必须与实体上定义的主键值的数量相匹配。

我错了什么?在我看来,主键由两个列组成,并且我正在为查找函数提供构成主键的两个值。

3个回答

56

Find 方法的签名为 TEntity Find(params Object[] keyValues),您可以按正确的顺序列出复合主键的键。

ViewBag.UserSkills.Find(WebSecurity.CurrentUserId, item.SkillId )

8
要按组合键查找实体,应使用此重载。
ViewBag.UserSkills.Find(WebSecurity.CurrentUserId, item.SkillId);

Msdn


0

列顺序号是从零开始的。请将其更改为0和1,而不是1和2。例如:

[Key, Column(Order = 0)]
public int UserId { get; set; }

[Key, Column(Order = 1)]
[ForeignKey("Skill")]
public int SkillId { get; set; }

1
我已经更新了列顺序,但似乎并没有影响到.Find()中参数的顺序。 - Tony L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接