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)
Если это не помогло, пожалуйста, укажите трассировку стека.