Ошибка «Значение не может быть нулевым. Имя параметра: сущность» при удалении объекта сущности - PullRequest
0 голосов
/ 16 августа 2011

Я получаю странную ошибку при попытке удалить объект. Я использую 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 ]

2 голосов
/ 16 августа 2011

Используйте Single вместо FirstOrDefault в GetEmployee. Это поможет исключить проблемы, связанные с отсутствием записи с совпадающим идентификатором.

0 голосов
/ 07 декабря 2016

По моему мнению, вы должны использовать: Remove () вместо Context.DeleteObject ()

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

Также проверьте, нет ли у вашего "Сотрудника" ссылок на внешние ключи, которыеможет помешать удалению этого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...