2011-10-11 2 views
1

내 프로젝트에서 우리는 데이터 액세스를위한 ORM으로 petapoco를 사용하고 있습니다. 그러나 일대 다 관계가있는 데이터를 삭제하는 동안 몇 가지 어려움에 직면 해 있습니다. 사용자 및 그룹이라는 두 개의 테이블이 있습니다. 여기서 한 사용자는 두 개 이상의 그룹 구성원이 될 수 있습니다. 그래서 사용자와 그룹 테이블은 프로젝트에서 별도의 모델로 노출되지 않은 UserGroup이라는 다른 테이블을 사용하여 관련됩니다. 그렇다면 어떻게 petapoco를 사용하여 그룹에서 사용자를 삭제할 수 있습니까? 이일대 다 관계가있는 동안 데이터를 삭제하는 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; } 
} 

내 그룹 모델은 사람이 나에게 도움을 줄 말라 내가이

/// <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); 
     } 
    } 

처럼 삭제를 수행 한 모든이

[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; } 
} 

모양처럼

내 사용자 모델은 보인다 이걸 해결하는거야? 대신 당신이 db.Execute을 사용할 것 db.Query를 사용

+0

, 왜 당신은'User' 테이블에 합류? 그곳에 합류하는 것이 필요하다고 생각하지 않습니다. –

+1

단지 delete sql을 실행하고 execute 메소드에 전달하십시오. 예. groupid = @ 0이고 userid가 (@ 1) 인 usergroup에서 삭제 – Schotime

답변

5

: 모두 필터 기준이`UserGroup` 테이블 열을 기반으로하는 경우

db.Execute(@"DELETE [UserGroup] 
      LEFT OUTER JOIN [User] ON [UserGroup].[UserId] = [User].[UserId] 
      WHERE [UserGroup].[UserId] IN (@0) AND [UserGroup].[GroupId] = @1", 
      userIds, 
      groupId);