проблема saveChanges - PullRequest
       5

проблема saveChanges

0 голосов
/ 21 августа 2011

Я пытаюсь удалить проект из базы данных, но получаю следующее исключение:

"DbUpdateException was unhandled"

------------------------------------------------------------
public class Project
{
    public Project()
    {
        Customers = new List<Customer>();
        Materials = new List<Material>();
        Workers = new List<Worker>();
    }

    [Key]
    public long ProjectID { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateFinished { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }

    //Customer TheCustomer = new Customer();

    public ICollection<Customer> Customers { get; set; }
    public ICollection<Material> Materials { get; set; }
    public ICollection<Worker> Workers { get; set; }
}

------------------------------------------------------------------------
if (cb_Projects.SelectedValue != null)
{
    using (var db = new ProjectContext())
    {

        Project p = db.Projects.Find(cb_Projects.SelectedValue);
        if (db.Entry(p).State == EntityState.Detached)
        {
            db.Projects.Attach(p);
        }

        p.Customers.Clear();
        p.Workers.Clear();
        p.Materials.Clear();
        db.Projects.Remove(p);
        db.SaveChanges();

1 Ответ

3 голосов
/ 21 августа 2011

Когда вы назвали это:

p.Customers.Clear();
p.Workers.Clear();
p.Materials.Clear();

Вы заметили, потому что это работает только в том случае, если коллекции заполнены, более того, если эти отношения один-ко-многим, вам также нужно будет уменьшить (вызов Remove)на каждом отдельном зависимом объекте.Для заполнения этих коллекций вы должны либо использовать готовую загрузку

long selectedValue = cb_Projects.SelectedValue;
Project p = db.Projects.Include(p => p.Customers)
                       .Include(p => p.Workers)
                       .Include(p => p.Materials)
                       .Single(p => p.ProjectID == selectedValue);

, либо пометить все три свойства как virtual, чтобы включить отложенную загрузку.

Ваш текущий код должен обрабатываться каскадным удалением.

Это также не имеет особого смысла:

if (db.Entry(p).State == EntityState.Detached)
{
    db.Projects.Attach(p);
}

Вы ищете проект в новом экземпляре контекста, поэтому он всегда будет загружаться из базы данных, и его состояние будетUnchanged.

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