如何解决在实体框架中附加现有子实体时发生异常
我以一种非常规的方式使用Entity Framework来跟踪Winforms应用程序中的更改。基本上,我通过API调用加载数据,并将数据附加到上下文中以显示在网格控件中。
我有一些要求在网格列(很多这样的列)中显示基于一对一关系的导航属性。为了实现这一点,需要跟踪部分。附加实体后,我将使用Local Data概念。
这是问题的简化示例
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int DepartmentId { get; set; }
public Department Department { get; set; }
}
public class Department
{
public int Id { get; set; }
public string Name { get; set; }
}
// Loading & Attaching records into the context
using (MyContext context = new MyContext())
{
// Get list of Students with Department data from API
var students = GetStudents();
foreach (var record in students )
{
var existingEntry = Set<T>().Local.FirstOrDefault(d => d.Id== record.Id);
if (existingEntry != null)
{
this.Entry(existingEntry).CurrentValues.SetValues(record);
this.Entry(existingEntry).State = EntityState.Unchanged;
}
else
{
// Throws exception because some students belong to same department and that department is already attached
Set<T>().Attach(record);
}
}
}
我了解检查存在性仅适用于学生级别,但是部门数据仍然会出现问题。在实际的实现中,我具有很多导航属性(每个实体平均15个),包括集合。另外,API检索和附加上下文是一个通用实现(代替GetStudents()
方法,我用一些API路由调用了一些其他方法,这些方法基于一些OData查询来检索数据列表)。
除了在附加之前使用反射检查每个记录的所有导航属性的存在之外,什么是合适的方法?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。