asp.net ef кодирует первые дубликаты элементов с внешним ключом - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующий код:

    public Exam CreateExam(string name, List<Question> questions, DateTime timeNow)
    {
        User user = GetUserByName(name);

        Exam exam = new Exam()
        {
            Questions = questions,
            StartDate = timeNow,
            User = user
        };
        Context.Exams.Add(exam);
        Context.SaveChanges();
        return exam;
    }

Экзамен:

public class Exam
{
    public int Id { get; set; }
    public DateTime StartDate { get; set; }
    public User User { get; set; }
    public virtual List<Question> Questions { get; set; }
}

И у пользователя есть основная информация о пользователе.

Моя проблема в том, что когда я создаюэкзамен для пользователя, изменение сохранения также добавляет нового пользователя в базу данных, причем отличается только идентификатор.Как мне предотвратить это и дать понять, что я хочу связать его с существующим пользователем?

Спасибо!

Редактировать: GetUserByName ():

Context.Database.SqlQuery<User>("Select * from Users where name = @name", new SqlParameter("name", name)).FirstOrDefault();

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

На основе Слава Утесинов ответ Трекер изменений Entity Framework не отслеживает изменения сущностей при получении из необработанного запроса, например:

Context.Database.SqlQuery<User>("Select * from Users where name = @name", new SqlParameter("name", name)).FirstOrDefault();

Поэтому при вызове метода SaveChanges () Entity Frameworkотслеживание изменений определяет состояние объекта пользователя как Добавлено (новый объект)

1.Вы можете использовать DbSet.SqlQuery вместо Database.SqlQuery , посколькуDbSet.SqlQuery будет отслеживаться контекстом:

Context.Users.SqlQuery("Select * from Users where name = @name", new SqlParameter("name", name)).FirstOrDefault();

или 2. Вы можете присоединить сущность к текущему контексту dbset как неизменное состояние

0 голосов
/ 01 октября 2018

Когда вы используете SqlQuery для извлечения пользователя, он не будет отслеживаться Entity Framework, потому что вы можете написать произвольный запрос и отобразить результат в класс User.Поэтому EF считают, что он новый, когда вы ссылаетесь на него.Чтобы решить эту проблему, вы должны вручную прикрепить его к контексту:

User user = GetUserByName(name);
Context.Users.Attach(user);
...