2014-07-15 7 views
0

두 개의 테이블은 다음과 같이 관련되어 있습니다. 사용자를 삭제하면 사용자 만 삭제되고 나에게 잘 돌아갑니다. 급여를 삭제하면이 레코드와 관련된 모든 사용자가 삭제됩니다. 나는 급여만을 삭제하고 싶다.데이터 삭제 관련 문제

class Employee 
{ 
    [Key] 
    public int EmployeeId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    [Range(00000000000.00, 999999999999.00, ErrorMessage = "Amount must be between 00000000000.00 and 999999999999.00")] 
    public decimal Phone { get; set; } 
    public int SalaryId { get; set; } 
    public virtual Salary Salary { get; set; } 

} 


    class Salary 
{ 
    [Key] 
    public int SalaryId { get; set; } 
    public string Name { get; set; } 
    [Range(0.01, 100000000.00, ErrorMessage = "Amount must be between 0.01 and 100000000.00")] 
    public decimal Amount { get; set; } 
} 


private void DelEmp() 
    { 
     if (abort) 
      return; 
     else 
     { 
      int selectedRows = dgv1.Rows.GetRowCount(DataGridViewElementStates.Selected); 
      for (int i = 0; i < selectedRows; ++i) 
      { 
       int id = Convert.ToInt32(dgv1.SelectedRows[i].Cells[0].Value); 
       var emp = empSalDB.Employees.Single(e => e.EmployeeId == id); 
       if (emp != null) 
       { 
        empSalDB.Employees.Remove(emp); 
        empSalDB.SaveChanges(); 
       } 
      } 
     } 
    } 



private void DelSal() 
    { 
     if (abort) 
      return; 
     else 
     { 
      int selectedRows = dgv1.Rows.GetRowCount(DataGridViewElementStates.Selected); 
      for (int i = 0; i < selectedRows; ++i) 
      { 
       int id = Convert.ToInt32(dgv1.SelectedRows[i].Cells[0].Value); 
       var sal = empSalDB.Salaries.Single(s => s.SalaryId == id); 
       if (sal != null) 
       { 
        empSalDB.Salaries.Remove(sal); 
        empSalDB.SaveChanges(); 
       } 
      } 
     } 
    } 
+0

데이터베이스에'CascadeDelete'가 설정되어 있습니까? – Default

+0

이들 엔티티에 대한 전체 정의가 있습니까? 이 문제의 원인은 관계와 탐색 속성에 있다고 생각합니다. 엔티티 프레임 워크는 기본적으로이 두 가지 방법을 사용하기 때문에 한쪽에서 삭제하면 다른 쪽에서 계단식 삭제가 발생합니다. –

답변

1

Employee 's SalaryId를 Nullable로 표시해야합니다. nullable이 아닌 경우 급여를 삭제하면 어떻게됩니까? 관련 Employee의 SalaryId는 삭제 된 Salary 's Id로 설정 될 수 없기 때문에 존재하지 않지만 Id null을 유지할 수 없습니다. 급여는 Employee에게는 선택 사항이므로 이것을 null로 허용하여 반영하십시오.

public class Employee 
{ 
    ... 
    public int? SalaryId { get; set; } 
} 

또는, 유창함 API의 WillCascadeOnDelete(true)를 사용하여 CascadeDelete 켤 수 있습니다.

+0

수정 사항이 잘못되었습니다. 'SalaryId'는 (아마도)'int'이므로'Salary'를로드하지 않고로드 할 수 있습니다. 따라서, 훨씬 더 효율적으로 될 수있는 관련 엔티티를로드 할 필요없이'int'에 대한 질의를 할 수 있습니다. Include를하거나 DbContexts를 사용하여 네비게이션 속성에 액세스하는 경우에만 Lazyload가됩니다. 'SalaryId'는 항상 존재합니다. – Default

+0

@Default - Salary 속성은'virtual'이므로 별도로 지정하지 않으면 지연로드됩니다. http://msdn.microsoft.com/en-us/data/jj574232.aspx –

+0

참조하십시오. Salary.SalaryId를 방문하면 Salary 속성이로드됩니다. 'SalaryId' 속성을 체크하면'Salary' 속성은 **로드되지 않습니다 **. 차이점이 있습니다. 때로는 관련 엔티티를로드하고 싶지 않을 수도 있습니다. – Default