代码之家  ›  专栏  ›  技术社区  ›  Andrew

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

  •  2
  • Andrew  · 技术社区  · 15 年前

    似乎没有什么例子,所以这里有:

    这是我的三个结构,但它似乎不能正确地创建表,当我调用以下行时,它说ID无法识别:

    IEnumerable<Permission> permissions = _data.Find<RolePermission>(x => x.Role.RoleKey == roleKey).Select(x => x.Permission);
    

    角色授权:

    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 回复  |  直到 15 年前
        1
  •  1
  •   Jürgen Steinblock    15 年前

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

    • 如果对象包含名为id subsonic的属性,则假定该属性是主键。
    • 如果没有,您必须通过用 SubSonicPrimaryKey 属性(就像你做的那样)。
    • 如果您有一个名为id的属性,并且它也用属性(比如您的角色和权限类)进行了修饰,那么Subsonic将查找该属性两次,并且不会检查它们是否都相等。然后它抛出了一个异常,因为它不能可靠地确定要取哪个。

    长话短说,你应该尝试:

    a)从ID列中删除属性

    b)将属性重命名为roleid或permissionid(这会更容易理解,因为您的rolepermission类具有称为rolepermissionid的pk)

    如果这不起作用,请提供stacktrace。

    推荐文章