Entity Inserts вместо обновления

Вопрос:

В моей сети я получаю объект вопроса Включая подкатегории, в которые он попадает, и связанные с языком данные. У этого также есть QuestionID, который является Первичным ключом для Вопроса. Я помещаю этот объект в PageSession и изменяю свойства, если пользователь хочет.

using (var bo = new BL.QuestionBO())
{
var question = bo.Get(QuestionID);
PageSession.CurrentQuestion = question;
}

public Question Get(long QuestionID)
{
return DataSource.Questions
.Include(q => q.TransQuestions)
.Include(q => q.SubCategories)
.FirstOrDefault(q => q.QuestionID == QuestionID);
}

Когда я добавляю объект обратно в DataContext, он добавляет новый объект вместо обновления другого.

DataSource.Questions.Add(QuestionEnt);
DataSource.SaveChanges();

Я что-то пропускаю или неправильно кодирую?

У меня ниже областей, в которых я могу ошибаться.

  1. Объекты контекста данных различаются при извлечении объекта.
  2. Я использую Questions.Add()
  3. Прокси-объекту может быть не важно вставить/обновить.

Ниже приведен класс, созданный.edmx

    public partial class Question
{
public Question()
{
this.ChallengeDetails = new HashSet<ChallengeDetail>();
this.TransQuestions = new HashSet<TransQuestion>();
this.SubCategories = new HashSet<SubCategory>();
}

public long QuestionID { get; set; }
public int QuestionTypeID { get; set; }
public int Status { get; set; }
public int InsertedBy { get; set; }
public Nullable<int> ModifiedBy { get; set; }

public virtual ICollection<ChallengeDetail> ChallengeDetails { get; set; }
public virtual QuestionType QuestionType { get; set; }
public virtual ICollection<TransQuestion> TransQuestions { get; set; }
public virtual ICollection<SubCategory> SubCategories { get; set; }
}

Ответ №1

Вот причина.

Причина, по которой это происходит, заключается в том, что при использовании метода DbSet.Add (то есть, Screencasts.Add) не только состояние корневого объекта с надписью “Добавлено”, но все на графике, о котором контекст ранее не знал также добавляется. Несмотря на то, что разработчик может знать, что тема имеет существующее значение идентификатора, Entity Framework чтит его EntityState (добавлено) и создает команду “Вставить базу данных для темы” независимо от существующего идентификатора.

Источник

Чтобы обновить объект, выполните следующие действия.

1. Вариант A, изменение состояния

DataSource.Entry(QuestionEnt).State = EntityState.Modified;
DataSource.SaveChanges();

2. Вариант B, Получить сущность из контекста

var questionEntDb = DataSource.Questions.Find(QuestionEnt.QuestionID);
questionEntDb.PropertyA = QuestionEnt.PropertyA;
questionEntDb.PropertyB = QuestionEnt.PropertyB;
questionEntDb.PropertyC = QuestionEnt.PropertyC;
DataSource.SaveChanges();

Когда вы вызываете метод Add, даже если он имеет существующий Id, состояние объекта становится Added и если вы вызываете Attach после вызова Add, состояние становится Unchanged. В этом случае он не будет делать вставку или обновление.

// State = Detached
DataSource.Questions.Add(QuestionEnt); // -> State = Added
DataSource.Questions.Attach(QuestionEnt); // -> State = Unchanged
DataSource.SaveChanges();

Оцените статью
TechArks.Ru
Добавить комментарий