我是Entity Framework的新手。我试图更新记录并保存对数据库的更改。
public void SaveEdit(Gate gate)
{
try
{
using (dc = new GateEntities())
{
var query = (from tbsite in dc.tblSites
where tbsite.ID == gate.ID
select tbsite).FirstOrDefault();
query.CalledInAt = gate.CalledInAt;
query.CallerRequest = gate.CallerRequest;
query.ContactPersonOnSite = gate.ContactPersonOnSite;
query.Email = gate.Email;
query.EmailSitePerson = gate.EmailSitePerson;
dc.SaveChanges();
}
}
catch (Exception ex)
{
throw ex;
}
}
它没有异常或错误消息,但它不会将更改保存到数据库。为什么它没有更新记录?
答案 0 :(得分:11)
修改query
对象后,您应该在调用Modified
之前将其状态更改为context.SaveChanges()
。您的上下文对象应该知道您修改的实体。假设dc
是您的上下文对象:
query.CalledInAt = gate.CalledInAt;
//change other properties ..
dc.Entry(query).State = EntityState.Modified;
dc.SaveChanges();
这应该适合你。
答案 1 :(得分:4)
你必须使用entityframework来选择你的对象,结果对象将是可跟踪的,所以试试这个
using (var dc = new GateEntities())
{
var gate = dc.tblSites.Where(g => g.ID == date.ID).FirstOrDefault();
gate.CalledInAt = gate.CalledInAt;
gate.CallerRequest = gate.CallerRequest;
gate.ContactPersonOnSite = gate.ContactPersonOnSite;
gate.Email = gate.Email;
gate.EmailSitePerson = gate.EmailSitePerson;
dc.SaveChanges();
}
答案 2 :(得分:0)
还注意到当实体未配置主键时会发生这种情况。 在EF Core上,检查您的OnModelCreating,并确保实体。HasKey(e => e.TheKey);存在。
根据文档,您不需要使用以下状态:https://docs.microsoft.com/en-us/ef/core/get-started/?tabs=netcore-cli
var yourEntity = await context.FirstOrDefaultAsync(e => e.Id = 1);//You can also call FindAsync(id)
yourEntity.Name = "NewName";//This line will let EF Core knows the entity has been modify
await context.SaveChangesAsync();
尽管您可以在以下位置检查如何使用状态:https://docs.microsoft.com/en-us/ef/ef6/saving/change-tracking/entity-state 代码如下:
var yourEntity = await context.FirstOrDefaultAsync(e => e.Id = 1);
yourEntity.Name = "NewName";
context.Entry(yourEntity).State = EntityState.Modified;
await context.SaveChangesAsync();
它们都是相同的,老实说,我更喜欢手动设置状态(在大型项目中),有时EF Core失去了对某些实体的跟踪(这是个人经验),因此我仔细检查将状态更新为“已添加”或“已修改”。 谢谢