Subsonic 3 - Простой репозиторий и создание внешнего ключа - PullRequest
2 голосов
/ 12 ноября 2010

Кажется, вряд ли есть примеры, вот так:

Вот мои три структуры, но кажется, что таблицы не создаются должным образом, и когда я вызываю следующую строку, это говорит, что Id нераспознается:

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

}

Разрешение:

public class Permission
    {

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

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

    }

Роль:

public class Role
    {

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

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

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

    }

1 Ответ

1 голос
/ 25 ноября 2010

Я не знаю, было ли это исправлено в текущем выпуске, но я помню глупую ошибку в обнаружении первичного ключа subsonic.

  • Если ваш объект содержит свойство с именем Id subsonic предполагает, что этоваш первичный ключ.
  • Если вы не обязаны сообщать subsonic with, является ли ваш PK украшением свойства с атрибутом SubSonicPrimaryKey (как вы сделали).
  • Если у вас есть свойство с именем Idи он также украшен атрибутом (таким как класс Role and Permission), subsonic находит свойство дважды и не проверяет, равны ли они оба.Затем он выдает исключение, потому что не может надежно определить, какой из них взять.

Короче говоря, вы должны попробовать:

a) Удалить атрибут из столбца Id

b) Переименуйте свойство в RoleId или PermissionId (что было бы более согласованным, поскольку у вашего класса RolePermission есть PK с именем RolePermissionId)

Если это не помогает, укажите трассировку стека.

...