使用另一个EntityObject更新EntityObject

时间:2012-09-18 09:02:30

标签: c# entity-framework

我有一点问题,我需要你的帮助。我正在使用Entity Framework进行数据库处理,我想更新此数据库中的数据集。

我有一个包含所有更改的EntityObject,并且希望能够使用现有Object更新此Object。

我正在使用以下代码更新数据:

IQueryable<Competitors> getCompetitor = DatabaseObject.Competitors.Where(SelectOnly => SelectOnly.competitorID == competitorObject.competitorID);
Competitors competitor = getCompetitor.First();
competitor = competitorObject;
DatabaseObject.SaveChanges();

但这不起作用。如何更新数据库中的日期?

2 个答案:

答案 0 :(得分:2)

假设您的competitorObject属于Competitors类型(competitor = competitorObject),您必须将其附加到您的上下文,将其标记为已修改,然后保存更改:

DatabaseObject.Competitors.Attach(competitorObject);
DatabaseObject.Entry(competitorObject).State = EntityState.Modified;
DatabaseObject.SaveChanges();

在您的情况下无需检索源对象,但如果没有附加,上下文对您更新的对象一无所知。

如果您使用ObjectContext API代替DbContext API,那么将对象标记为已修改的代码可能略有不同:

DatabaseObject.ObjectStateManager.GetObjectStateEntry(competitorObject).SetModified();

答案 1 :(得分:0)

您需要对代码进行的唯一更改是更新获取的实体上的至少一个属性。您正在更新引用,而不是属性值,如下所示:

IQueryable<Competitors> getCompetitor = DatabaseObject.Competitors.Where(SelectOnly =>       SelectOnly.competitorID == competitorObject.competitorID);
Competitors competitor = getCompetitor.First();
competitor.Name = competitorObject.Name;
competitor.Contact = competitorObject.Contact;
DatabaseObject.SaveChanges();

或者正如Dennis所说,您可以将CompetitorObject附加到上下文并将其标记为已修改。这样做会覆盖现有Competitors记录的所有属性,其值为CompetitorObject