2

Il semble y avoir guère d'exemple là-bas donc voilà:Subsonic 3 - dépôt simple et la création d'une clé étrangère

Voici mes trois structures, mais il ne semble pas créer les tables correctement et quand je l'appelle la ligne suivante, il dit Id est pas reconnu:

IEnumerable<Permission> permissions = _data.Find<RolePermission>(x => x.Role.RoleKey == roleKey).Select(x => x.Permission); 

RolePermission:

public class RolePermission 
{ 

    [SubSonicPrimaryKey] 
    public int RolePermissionId { get; set; } 

    public int RoleId { get; set; } 
    public int PermissionId { get; set; } 

    //Foreign Key of Role 
    public Role Role { get; set; } 

    //Foreign key of Permission 
    public Permission Permission { get; set; } 

} 

Permission:

public class Permission 
    { 

     [SubSonicPrimaryKey] 
     public int Id { get; set; } 
     [SubSonicLongString] 

     public string PermissionKey { get; set; } 
     [SubSonicLongString] 
     public string PermissionDescription { get; set; } 

    } 

Rôle:

public class Role 
    { 

     [SubSonicPrimaryKey] 
     public int Id { get; set; } 

     [SubSonicLongString] 
     public string RoleKey { get; set; } 

     [SubSonicLongString] 
     public string RoleDescription { get; set; } 

    } 

Répondre

1

Je ne sais pas si cela a été corrigé dans une version actuelle, mais je me souviens d'un bug idiot dans la détection de clé primaire subsonique.

  • Si votre objet contient une propriété nommée Id Subsonic suppose que c'est votre clé primaire.
  • Si non vous devez dire subsonic avec votre PK en décorant une propriété avec l'attribut SubSonicPrimaryKey (comme vous l'avez fait).
  • Si vous possédez une propriété appelée Id et qu'elle est également décorée avec l'attribut (comme votre classe Role and Permission), subsonic trouve la propriété deux fois et ne vérifie pas si les deux sont égaux. Ensuite, il lance une exception car il ne peut pas déterminer avec certitude lequel prendre.

Longue histoire courte, vous devriez essayer:

a) Supprimez l'attribut de votre colonne Id

b) Renommer la propriété à RoleId ou PermissionId (qui serait plus consistend parce que votre classe RolePermission a son PK appelé RolePermissionId)

Si cela ne vous aide pas, veuillez fournir un stacktrace.

+0

+1 de réponse l'essaiera plus tard et vous le ferai savoir – Andrew