Структура сущностей Добавить сущность также добавляет дочерние сущности - PullRequest
1 голос
/ 03 августа 2011

У меня есть таблица «Обучение», в которой есть столбец «CreatedBy», который имеет ссылочную целостность к таблице «Пользователь». Таким образом, «CreatedBy» на самом деле является «пользователем», представляющим пользователя, который вставил запись обучения.

Теперь, когда я добавляю новую сущность «Обучение», это «CreatedBy» - старый «Пользователь». Так что не стоит пытаться добавить пользователя. Но он терпит неудачу, потому что нарушает ограничение уникального ключа.

Вот код. Куда я иду не так?

    public int AddEntity(Training entity, bool isSaveInstantly)
    {
        this.trainersDeskDBModel.Trainings.AddObject(entity);

        if (isSaveInstantly)
        {
            this.trainersDeskDBModel.SaveChanges();
        }
        return entity.Id;
    }

    public int UpdateEntity(Training entity, bool isSaveInstantly)
    {
        this.trainersDeskDBModel.Trainings.ApplyCurrentValues(entity);
        if (isSaveInstantly)
        {
            this.trainersDeskDBModel.SaveChanges();
        }
        return entity.Id;
    }

    public int Save(Training entity, bool isSavedInstantly)
    {
        IEnumerable<Training> training = this.trainersDeskDBModel.Trainings.Where(x => x.Id == entity.Id);
        if (training != null && training.Count() > 0)
        {
            this.UpdateEntity(entity, isSavedInstantly);
        }
        else
        {
            this.AddEntity(entity, isSavedInstantly);
        }
        return entity.Id;
    }

1 Ответ

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

Если вы не загрузили User в том же контексте, где вы добавляете новый Training, вы должны EF сообщить, что User уже существует в БД, прикрепив его к контексту перед добавлениемновый Training:

public int AddEntity(Training entity, bool isSaveInstantly)
{
    this.trainersDeskDBModel.Users.Attach(entity.CreatedBy);
    this.trainersDeskDBModel.Trainings.AddObject(entity);

    if (isSaveInstantly)
    {
        this.trainersDeskDBModel.SaveChanges();
    }
    return entity.Id;
}
...