Код EF при первой вставке объектов с «один ко многим» вызывает исключение: «Оператор сохранения, вставки или удаления затронул неожиданное количество строк (0)». - PullRequest
2 голосов
/ 21 февраля 2012

Я использую классы POCO с EF Code First.

У меня есть класс Ball как:

public class Ball
{
    [Key]
    public int BallId { get; set; }

    public Box Container { get; set; }

    [Required]
    public bool IsCounted{get; set;}
}

и коробка класса как:

public class Box
{
    [Key]
    public int BoxId { get; set; }

    [Required]
    public string Description { get; set; }

    public ICollection<Ball> Balls { get; set; }

}

У меня есть список уже созданных шаров, с помощью которых я хочу создать новый ящик! Когда коробка создана:

  1. Каждый шар должен иметь свойство IsCounts true
  2. Ссылка box.Balls должна указывать на существующие объекты
  3. Мяч. Контейнер должен указывать на новый ящик!

    public void CreateBox(string Description, ICollection<Ball> givenBalls)
    {
        using (var c = new BoxEntryModel())
        {
            Box entry = new Box();
            if (c.Boxes.Count().Equals(0))
                entry.BoxId = 1;
            else 
                entry.BoxId = c.Boxes.Max<Box>(b => b.BoxId) + 1;
            entry.Description = Description;
            entry.Balls = givenBalls;                
            try
            {
                foreach (Ball ball in givenBalls)
                {
                    c.Balls.Attach(ball);
                    ball.IsCounted = true;
                    ball.Container = entry;
                }
                c.Boxes.Add(entry);
                c.SaveChanges();
            }
    }
    

    Этот фрагмент кода дает мне исключение:

Оператор хранения, вставки или удаления затронул неожиданное количество строк (0). Объекты могут быть изменены или удалены с момента загрузки объектов. Обновите записи ObjectStateManager. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Data.OptimisticConcurrencyException: оператор обновления, вставки или удаления магазина затронул неожиданное количество строк (0). Объекты могут быть изменены или удалены с момента загрузки объектов. Обновите записи ObjectStateManager.

Также, если я прокомментирую строку c.Balls.Attach (расход); код работает, но он создает новые строки для каждого шара, который я пытаюсь добавить в поле.

Пожалуйста, помогите мне сохранить сущности в соответствии с отношениями. Заранее спасибо.

1 Ответ

0 голосов
/ 01 января 2013

Из кода, который вы здесь поместили, кажется, что на самом деле у вас нет правильной настройки FK между шарами и коробкой в ​​EF.EF может быть смущен тем, почему вы прикрепляете шары, когда ничего не редактируется (по крайней мере, в соответствии с EF).Попробуйте настроить следующее в вашем коде Box:

public class Ball
{
    [Key]
    public int BallId { get; set; }

    [ForeignKey("Container")]
    public int BoxID { get; set; }

    public Box Container { get; set; }

    [Required]
    public bool IsCounted{get; set;}
}

Если это не сработает, проверьте EntityState для каждого из шаров в GivenBalls (c.Entry(ball).State) и посмотрите, не отсоединились ли они..

Дайте мне знать, как это работает.

...