首先使用Web API 2和EF 6.1代码.
我正在尝试添加一个新模板(参见模型),该模板与已有的TimePeriods和Stations有关系.
public class Template { public int TemplateID { get; set; } public string Name { get; set; } public List<TimePeriod> TimePeriods { get; set; } public List<Station> Stations { get; set; } } public class Station { public int StationID { get; set; } public string Name { get; set; } public List<Template> Templates { get; set; } } public class TimePeriod { public int TimePeriodID { get; set; } public TimeSpan From { get; set; } public TimeSpan To { get; set; } public List<Template> Templates { get; set; } }
新模板对象包含Station列表和具有正确ID /主键的TimePeriod列表.我希望EF能够通过查看主键来识别相关实体已经存在,但似乎没有.相反,所有相关实体再次添加导致重复.
private SchedulingContext db = new SchedulingContext(); [ResponseType(typeof(Template))] public IHttpActionResult PostTemplate(Template template) { if (!ModelState.IsValid) { return BadRequest(ModelState); } db.Templates.Add(template); db.SaveChanges(); return CreatedAtRoute("DefaultApi",new { id = template.TemplateID },template); }
这是否与我使用新的上下文有关?如果是这样,我该如何防止这种行为?
解决方案感谢Evandro:
public void PostTemplate(Template template) { db.Templates.Add(template); foreach (var item in template.Stations) { db.Entry<Station>(item).State = EntityState.Unchanged; } foreach (var item in template.TimePeriods) { db.Entry<TimePeriod>(item).State = EntityState.Unchanged; } db.SaveChanges(); }
解决方法
Lorentz,这是Entity Framework的默认行为.您必须根据系统应该执行的操作明确定义自定义行为.
首先,您可以使用以下示例访问上下文中的实体状态:
EntityState state = db.Entry<Station>(station).State;
您可以打印状态,然后查看EF正在做什么.
现在,当您第一次收到Template的实例时,它在上下文中的状态将被分离.
将其添加到上下文后,状态将更改为“已添加”.这将适用于模板,站点和TimePeriod(s).
即使您正确设置了Id(主键),EF也会丢弃ID,创建新ID并向表中添加新行,这就是您的程序正在发生的事情.这就是我设法在我的代码中重现的东西.
您必须为每个实体定义EntityState,以便EF知道它不应该保留新项目.以下是EF 6.1的可能值:
// This is probably what you are looking for db.Entry<Station>(station).State = EntityState.Unchanged; // This one maybe,if you are receiving updated values for the State db.Entry<Station>(station).State = EntityState.Modified; // Others that may apply for other scenarios db.Entry<Station>(station).State = EntityState.Detached; db.Entry<Station>(station).State = EntityState.Added; db.Entry<Station>(station).State = EntityState.Deleted;
由于模板有多个用于Station和TimePeriod的itens,你必须迭代它们并将每个设置为“Unchanged”我假设或“修改”.
如果有效,请告诉我.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。