Question

There seems to be hardly any examples out there so here goes:

Here are my three structures but it doesn't seem to create the tables properly and when I call the following line it says Id is not recognised:

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

    }

Role:

public class Role
    {

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

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

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

    }
Was it helpful?

Solution

I don't know if this has been fixed in a current release but I remember a silly bug in subsonic's primary key detection.

  • If your Object contains a property named Id subsonic assumes that is your primary key.
  • If not you have to tell subsonic with is your PK by decorating a property with the SubSonicPrimaryKey attribute (like you did).
  • If you have a property called Id and it is also decorated with the attribute (like your Role and Permission class) subsonic finds the property twice and does not check if they both equals. Then it throws an exception because it can't reliably determine which one to take.

Long story short, you should try:

a) Remove the Attribute from your Id column

b) Rename the property to RoleId or PermissionId (which would be more consistend because your RolePermission class has it's PK called RolePermissionId)

If that doesn't help, please provide a stacktrace.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top