Petapoco удаляет данные, имея отношения один ко многим? - PullRequest
1 голос
/ 11 октября 2011

В моем проекте мы используем petapoco как ORM для доступа к данным.Но я сталкиваюсь с некоторыми трудностями при удалении данных, которые имеют отношения один ко многим.У меня есть две таблицы с именем пользователя и группы.Здесь один пользователь может быть членом более чем одной группы.таким образом, таблица пользователя и группы связана с использованием другой таблицы с именем 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);
        }
    }

Кто-нибудь мне помогает в решении этой проблемы?

1 Ответ

6 голосов
/ 01 декабря 2011

Вместо использования 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);
...