删除实体对象时出错“值不能为空。参数名称:实体”

时间:2011-08-15 20:15:53

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-3

当我尝试删除实体时,我收到一个奇怪的错误。我正在使用Entity Framework 4,C#和ASP.NET MVC 3。

这是我的控制器和删除实体对象的功能:

public class EmployeesController : Controller
{
    readonly IEmployeesRepository _employeesRepository;

    public EmployeesController()
    {
        _employeesRepository = new SqlEmployeesRepository();
    }

    public RedirectToRouteResult Delete(int id)
    {
        var employee = _employeesRepository.GetEmployee(id);
        _employeesRepository.DeleteEmployee(employee);
        TempData["message"] = employee.Name + " was deleted";
        return RedirectToAction("Index");
    }
}

存储库代码:

public class SqlEmployeesRepository : IEmployeesRepository
{
    private readonly MyDBEntities _entities;

    public SqlAgencyTypesRepository()
    {            
        _entities = new MyDBEntities();
    }


    public IQueryable<Employee> Employees
    {
        get { return _entities.Employees.AsQueryable(); }
    }


    public Employee GetEmployee(int id)
    {
        return Employees.FirstOrDefault(e => e.EmployeeID == id);
    }


    public void DeleteEmployee(Employee employee)
    {
        _entities.Employees.Context.DeleteObject(employee);
        _entities.Employees.Context.SaveChanges();
    }
}

一些奇怪的事情:

  • 该项目确实已删除。 DeleteObject行发生错误,但仍然会被删除。
  • 这不会发生在我的本地计算机上,只会在生产时发生。两者之间的唯一区别是连接字符串。

    <!-- Local conn string -->
    <!--<add name="MyDBEntities" connectionString="metadata=res://*/Entities.MyDB.csdl|res://*/Entities.MyDB.ssdl|res://*/Entities.MyDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MyDB.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />-->
    
    <!-- Production conn string -->
    <add name="MyDBEntities" connectionString="metadata=res://*/Entities.MyDB.csdl|res://*/Entities.MyDB.ssdl|res://*/Entities.MyDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;Server=mysite.com;Database=MyDB;User ID=***;Password=***;Trusted_Connection=True;Integrated Security=False;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
    

有人知道这里发生了什么吗?

2 个答案:

答案 0 :(得分:2)

在GetEmployee中使用Single而不是FirstOrDefault。这将有助于排除与没有匹配ID的记录相关的问题。

答案 1 :(得分:0)

在我看来你应该使用:Remove()而不是Context.DeleteObject()

_entities.Employees.Remove(employee); _entities.SaveChanges();

同时检查您的“员工”是否没有可能阻止删除此对象的外键引用。