Subsonic 3 - Простой репозиторий и создание внешнего ключа

Похоже, примеров здесь почти нет, так что вот так:

Вот мои три структуры, но кажется, что они не создают таблицы должным образом, и когда я вызываю следующую строку, он говорит, что 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 ответ

Решение

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

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

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

а) Удалите Атрибут с вашего столбца Id

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

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

Другие вопросы по тегам