Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除数据的问题_C#_Entity Framework - Fatal编程技术网

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
,即更高效。