实体框架更新记录不起作用

时间:2013-09-19 04:03:23

标签: asp.net-mvc linq entity-framework asp.net-mvc-4

我是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;
            }



        }

它没有异常或错误消息,但它不会将更改保存到数据库。为什么它没有更新记录?

3 个答案:

答案 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失去了对某些实体的跟踪(这是个人经验),因此我仔细检查将状态更新为“已添加”或“已修改”。 谢谢