2

そこにはほとんど例がないように思われるので、ここに行きます:

これが私の3つの構造ですが、テーブルを適切に作成していないようで、次の行を呼び出すと、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; }

    }
4

1 に答える 1

1

これが現在のリリースで修正されているかどうかはわかりませんが、subsonic の主キーの検出にばかげたバグがあったことを覚えています。

  • オブジェクトに Id subsonic という名前のプロパティが含まれている場合、それが主キーであると見なされます。
  • そうでない場合は、プロパティを属性で装飾することにより、サブソニックにPKを伝える必要がありSubSonicPrimaryKeyます(あなたがしたように)。
  • Id というプロパティがあり、それが属性 (Role や Permission クラスなど) で装飾されている場合、subsonic はプロパティを 2 回検出し、両方が等しいかどうかをチェックしません。次に、どちらを取得するかを確実に判断できないため、例外がスローされます。

簡単に言うと、次のことを試してください。

a) Id 列から属性を削除します

b) プロパティの名前を RoleId または PermissionId に変更します (RolePermission クラスには RolePermissionId と呼ばれる PK があるため、より一貫性が高くなります)。

それでも問題が解決しない場合は、スタック トレースを提供してください。

于 2010-11-25T11:30:07.503 に答える