实体插入而不是更新

时间:2014-07-21 11:04:55

标签: linq entity-framework entity-framework-5

在我的网站中,我正在检索问题对象包含它所属的子类别以及与语言相关的数据。它还有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. 代理对象可能不关心插入/更新。
  4. 以下是.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 个答案:

答案 0 :(得分:1)

原因就在这里。

  

它发生的原因是当你使用DbSet.Add方法时(那个   是,Screencasts.Add),不仅标记了根实体的状态   “已添加”,但图中的所有内容都没有   以前意识到标记已添加。即使是开发人员   可能知道主题具有现有的Id值,实体框架   尊重其EntityState(已添加)并创建一个Insert数据库命令   对于主题,无论现有的Id。

Source

要更新实体,您可以选择以下选项。

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();