我在针对.Net 4.5的
Windows服务中使用此代码,该服务使用数据库优先的Entity Framework层:
var existingState = DataProcessor.GetProcessstate(workerId); existingState.ProcessstatusTypeId = (int)status; existingState.PercentProgress = percentProgress; existingState.ProgressLog = log; DataProcessor.UpdateProcessstate(existingState);
public Processstate GetProcessstate(int id) { using (var context = new TaskManagerEntities()) { var processes = (from p in context.Processstates.Include("Processtype").Include("ProcessstatusType") where p.IsActive && p.ProcessstateId == id select p); return processes.FirstOrDefault(); } } public Processstate UpdateProcessstate(Processstate processstate) { using (var context = new TaskManagerEntities()) { context.Processstates.Add(processstate); context.Entry(processstate).State = System.Data.EntityState.Modified; context.SaveChanges(); } return processstate; }
Processstate是另外两个类(ProcessstatusType和Processtype)的父级.当我在Windows服务中运行该代码时,它会检索记录,更新实体并保存它.尽管Processtype子元素从未在上面的代码中使用,但是当执行Processstate实体上的保存时,EF会在Processtype表上执行插入操作并在其中创建新记录.然后,它会更改Processstatus实体中的FK,将其指向新子项并将其保存到数据库中.
它不会在ProcessstatusType表中执行此操作,该表使用基本相同的FK父子关系进行设置.
我现在有一个完全相同的Processtype条目的数据库,我不需要,我不知道为什么会这样.我觉得我犯了一些我无法看到的明显错误,因为这是我的第一个EF项目.问题是我允许上下文在调用之间到期但保持相同的实体吗?
解决方法
使用Add将所有元素的状态设置为Added,这将导致插入子元素.在为此元素指定EntityState.Modified时未插入父元素.
尝试在UpdateProcessstate中使用以下内容,而不是使用Add.
context.Processstates.Attach(processstate); context.Entry(processstate).State = EntityState.Modified; context.SaveChanges();
Attach将所有元素的状态设置为Unchanged,并通过为父元素指定Modified来指示只应更新此元素.
另一个注意事项.您应该使用强类型包含(x => x.Processtype)而不是Include(“Processtype”).
原文地址:https://www.jb51.cc/aspnet/247162.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。