2014-04-26 12 views
14

ho il seguente modello e sto cercando di trovare un oggetto specifico in un DbSet:Trovare un elemento in una DbSet con un primario composito chiave

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; } 
} 

Ho provato i seguenti due modi di trovare una certa UserSkill oggetto (sto passando il DbSet del UserSkills attraverso il ViewBag):

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

Ma in entrambi i casi, si ottiene un errore:

The number of primary key values passed must match number of primary key values defined on the entity.

Cosa mi manca? Mi sembra che la chiave primaria sia composta da due colonne e che fornisca la funzione di ricerca con i due valori che comprendono la chiave primaria.

risposta

27

La firma del metodo Find è TEntity Find(params Object[] keyValues) ed è possibile inserire le chiavi della chiave primaria composita nell'ordine corretto.

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

Per trovare un soggetto da chiave composita si dovrebbe usare questo overload

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

Msdn

-1

numeri colonna Ordine sono a base zero. Passare a 0 e 1 invece di 1 e 2. ie:

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

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