1

私のプロジェクトでは、データ アクセス用の ORM として petapoco を使用しています。しかし、1 対多の関係を持つデータを削除するときに、いくつかの問題に直面します。user と group という名前の 2 つのテーブルがあります。ここでは、1 人のユーザーが複数のグループのメンバーになることができます。したがって、ユーザーとグループのテーブルは、別のモデルとしてプロジェクトで公開されていない UserGroup という名前の別のテーブルを使用して関連付けられます。では、petapoco を使用してグループからユーザーを削除するにはどうすればよいですか?

私のユーザーモデルは次のようになります

[TableName("User")]
[PrimaryKey("UserId")]
[ExplicitColumns]
public class User
{
    [Column("UserId")]
    public int Id { get; set; }

    [Column]
    [Required]
    public Guid Identifier { get; set; }

    [Column("UserStatusId")]
    [Required]
    public UserStatus UserStatus { get; set; }

    [Column("RoleId")]
    [Required]
    public Role Role { get; set; }

    [Column]
    public int? SchoolId { get; set; }

    [Column]
    public int? LanguageId { get; set; }

    [Column]
    public int? LevelId { get; set; }

    [Column("TitleId")]
    public Title Title { get; set; }

    [Column]
    public int? GenderId { get; set; }

    [Column]
    [Required]
    [StringLength(35)]
    public string Username { get; set; }

    [StringLength(100)]
    public string Password { get; set; }

    [Column]
    [StringLength(100)]
    public string PasswordEncrypted { get; set; }

    [Column]
    [StringLength(10)]
    public string PasswordSalt { get; set; }

    [Column]
    //[Required]
    [DataType(DataType.EmailAddress)]
    [StringLength(255)]
    public string Email { get; set; }

    [Column]
    [Required]
    [StringLength(35)]
    public string FirstName { get; set; }

    [Column]
    [Required]
    [StringLength(35)]
    public string LastName { get; set; }

    public string FullName
    { 
        get
        {
            return string.Concat(FirstName, " ", LastName);
        }
    }

    public string FormalName
    {
        get
        {
            if ((int)Title != 0)
            {
                return string.Concat(Title, " ", LastName);
            }
            else
            {
                return LastName;
            }
        }
    }

    [Column]
    public DateTime? DateOfBirth { get; set; }

    [Column]
    public bool Subscribed { get; set; }

    [Column]
    public bool TermsAgreed { get; set; }

    [Column]
    public DateTime? TermsAgreedDate { get; set; }

    [Column]
    public DateTime CreatedDate { get; set; }

    [Column]
    public DateTime ModifiedDate { get; set; }

    [Column]
    public DateTime? LoginDate { get; set; }

    public School School { get; set; }

    public Gender Gender { get; set; }

    public Language Language { get; set; }

    public Level Level { get; set; }

    public IList<Group> Groups { get; set; }
}

私のグループモデルは次のようになります

[TableName("Group")]
[PrimaryKey("GroupId")]
[ExplicitColumns]
public class Group
{
    [Column("GroupId")]
    public int Id { get; set; }

    [Column]
    public int OwnerUserId { get; set; }

    [Column]
    public string Name { get; set; }

    [Column]
    public DateTime CreatedDate { get; set; }

    [Column]
    public DateTime ModifiedDate { get; set; }

    public User OwnerUser { get; set; }

    public IList<User> Users { get; set; }
}

このような削除を行ったもの

    /// <summary>
    /// Delete users from groups
    /// </summary>
    /// <param name="userIds">user Id list</param>
    /// <param name="groupId">group Id</param>
    public void DeleteUsersFromGroup(List<int> userIds, int groupId)
    {
        using (Database db = this.GetDatabase())
        {
            var sql = Sql.Builder.Append(
                @"DELETE [UserGroup]
                LEFT OUTER JOIN [User] ON [UserGroup].[UserId] = [User].[UserId]
                WHERE [UserGroup].[UserId] IN (@0) AND [UserGroup].[GroupId] = @1",
                userIds,
                groupId);
            db.Query<User>(sql);
        }
    }

誰かがこれを解決するのを手伝ってくれますか?

4

1 に答える 1

6

db.Query を使用する代わりに、 db.Execute を使用する必要があります。

db.Execute(@"DELETE [UserGroup]
            LEFT OUTER JOIN [User] ON [UserGroup].[UserId] = [User].[UserId]
            WHERE [UserGroup].[UserId] IN (@0) AND [UserGroup].[GroupId] = @1",
            userIds,
            groupId);
于 2011-12-01T16:52:19.307 に答える