在实体框架中附加现有子实体时发生异常

时间:2020-08-14 19:35:20

标签: c# winforms entity-framework data-binding change-tracking

我以一种非常规的方式使用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查询来检索数据列表)。

除了在附加之前使用反射检查每个记录的所有导航属性的存在之外,什么是合适的方法?

0 个答案:

没有答案