Subsonic 3 - 简单存储库并创建外键

时间:2010-11-11 22:21:38

标签: subsonic foreign-key-relationship subsonic-simplerepository

似乎几乎没有任何例子,所以这里有:

以下是我的三个结构,但它似乎没有正确创建表格,当我调用以下行时,它表示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 个答案:

答案 0 :(得分:1)

我不知道这是否已在当前版本中修复,但我记得亚音速主键检测中存在一个愚蠢的错误。

  • 如果您的Object包含名为Id subsonic的属性,则假定这是您的主键。
  • 如果不是,你必须通过装饰具有SubSonicPrimaryKey属性的属性(就像你所做的那样)来告诉亚力量是你的PK。
  • 如果您有一个名为Id的属性,并且它也使用属性(如您的角色和权限类)进行修饰,则亚力学会找到该属性两次,并且不检查它们是否都等于。然后它抛出异常,因为它无法可靠地确定要采取哪一个。

长话短说,你应该试试:

a)从您的Id列中删除属性

b)将该属性重命名为RoleId或PermissionId(由于您的RolePermission类具有名为RolePermissionId的PK,因此会更加有意义)

如果这没有帮助,请提供堆栈跟踪。