C# 删除数据的问题
两个表如下所示。当我删除任何用户时,只有用户会被删除,这对我来说没关系。当我删除任何薪资时,与此记录相关的所有用户都将被删除。我只想删除薪水C# 删除数据的问题,c#,entity-framework,C#,Entity Framework,两个表如下所示。当我删除任何用户时,只有用户会被删除,这对我来说没关系。当我删除任何薪资时,与此记录相关的所有用户都将被删除。我只想删除薪水 class Employee { [Key] public int EmployeeId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [Range(00000000000.00, 99
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();
}
}
}
}
class员工
{
[关键]
public int EmployeeId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
[范围(00000000000.00、9999999999.00、ErrorMessage=“金额必须介于00000000000.00和99999999999.00之间”)]
公用十进制电话{get;set;}
public int SalaryId{get;set;}
公共虚拟薪资{get;set;}
}
班级工资
{
[关键]
public int SalaryId{get;set;}
公共字符串名称{get;set;}
[范围(0.01100000000.00,ErrorMessage=“金额必须介于0.01和100000000.00之间”)]
公共十进制数{get;set;}
}
私有void DelEmp()
{
如果(中止)
返回;
其他的
{
int selectedRows=dgv1.Rows.GetRowCount(DataGridViewElementState.Selected);
for(int i=0;ie.EmployeeId==id);
如果(emp!=null)
{
empSalDB.Employees.Remove(emp);
empSalDB.SaveChanges();
}
}
}
}
私有的void DelSal()
{
如果(中止)
返回;
其他的
{
int selectedRows=dgv1.Rows.GetRowCount(DataGridViewElementState.Selected);
for(int i=0;is.SalaryId==id);
如果(sal!=null)
{
empSalDB.薪水.移除(sal);
empSalDB.SaveChanges();
}
}
}
}
您需要将员工的SalaryId标记为可空。如果它不可为null,那么删除薪资时会发生什么情况?无法将相关员工的SalaryId设置为已删除薪资的Id,因为该Id不存在,但不能将Id保留为空。工资对于员工来说是可选的,所以通过允许它为空来反映
public class Employee
{
...
public int? SalaryId { get; set; }
}
或者,您可以使用Fluent API的
WillCascadeDelete(true)
打开CascadeDelete。您在数据库中设置了CascadeDelete
吗?这些是这些实体的完整定义吗?我怀疑原因在于它们的关系和导航属性。实体框架在默认情况下通常采用两种方式,这就是为什么从一种方式删除会在另一种方式中导致级联删除。您的编辑不正确。由于SalaryId
可能是一个int
,因此可以在不加载Salary
的情况下加载它。因此,您可以在int
上执行查询,而无需加载相关的实体,这样会更加高效。只有当您使用包含
或使用访问DbContexts中的导航属性时,它才会懒散地加载SalaryId
始终存在。@默认值-Salary属性为virtual
,因此除非另有指定,否则它是延迟加载的。查看是否访问Salary.SalaryId
将加载Salary
属性。如果选中SalaryId
属性,则不会加载Salary
属性。这是不同的。有时您不想加载相关的实体。@默认值,但当主体加载时,lazy loaded属性不加载吗?在这种情况下,无论何时加载员工,您都将加载其工资,对吗?第一次使用虚拟道具时,它不会加载虚拟道具,而是在加载员工时加载虚拟道具。除非我弄错了-这对我来说不会太疯狂。只有在DbContexts中使用,告诉它被包括(通过ObjectQuery.Include)或在您提供的链接中(使用.ToList()
)时,它才会被加载。如果您不使用这些方法并离开使用,然后尝试访问Salary
,您将得到一个ObjectDisposedException
。但是,SalaryId将被填充。所以不,如果你不告诉它,它就不会加载。我的观点是,例如,如果您有一个salaryId
要使用,并且希望获得具有该Id的员工,您可以对salaryId
(它不会加载Salary
)进行查询,而无需加载Salary
,即更高效。