在我的网站中,我正在检索问题对象包含它所属的子类别以及与语言相关的数据。它还有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();
我错过了什么或编码错误吗?
我有以下可能出错的地方。
以下是.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; }
}
答案 0 :(得分:1)
原因就在这里。
它发生的原因是当你使用DbSet.Add方法时(那个 是,Screencasts.Add),不仅标记了根实体的状态 “已添加”,但图中的所有内容都没有 以前意识到标记已添加。即使是开发人员 可能知道主题具有现有的Id值,实体框架 尊重其EntityState(已添加)并创建一个Insert数据库命令 对于主题,无论现有的Id。
要更新实体,您可以选择以下选项。
DataSource.Entry(QuestionEnt).State = EntityState.Modified;
DataSource.SaveChanges();
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();