【问题标题】:ObjectContext object error- EFObjectContext 对象错误 - EF
【发布时间】:2017-10-21 16:07:17
【问题描述】:

我有两个用 EF CodeFirst 编写的表:

public class DayType
{
 [Key]
 public int DayTypeID { get; set; }
 public string NameDayType { get; set; }        
 public virtual ICollection<SpecialDay> Specialdays { get; set; }
 public DayType() { }
}
public class SpecialDay
{
 [Key]
 public int SpecialDayID { get; set; }
 public int Year { get; set; }
 public int JanuaryDay { get; set; }
 public SpecialDay() { }
 public int? DayTypeId { get; set; }
 public virtual DayType daytype { get; set; }
}

DBContext 的一对多关系是由 FluentAPI 实现的:

 modelBuilder.Entity<DayType>().HasMany(p => p.Specialdays).WithOptional(p => p.daytype);

此代码抛出异常。函数的目的是更新实体。调试时sd 具有所有属性。 sd - 是从数据网格中选择然后更改的对象。

internal void Update(SpecialDay sd)
{
   using (SalDBContext _db = new SalDBContext())
   {
      var newsd = _db.SpecialDays.FirstOrDefault(p => p.SpecialDayID==sd.SpecialDayID);
      newsd.JanuaryDay = sd.JanuaryDay;
      ....
      newsd.DecemberDay = sd.DecemberDay;
      newsd.DayTypeId = sd.DayTypeId;
      newsd.daytype = sd.daytype;
      try
      {
          _db.SaveChanges();
      }
      catch (Exception ex)
      {
         MessageBox.Show(ex.ToString());
      }
   }

此时发生异常_db.SaveChanges();Exception:

{“无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象。”} System.Exception {System.InvalidOperationException}

感谢您为我的问题提供解决方案的任何帮助。谢谢

【问题讨论】:

    标签: c# entity-framework ef-code-first


    【解决方案1】:

    正如例外所述,

    “无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。”

    查看那里的代码,您将 daytype 从传入的代码分配给从数据库中提取的代码。因为每次调用 Update 方法时都会创建一个新的 SalDBContext,所以您将在 ObjectContext 对象之间分配 daytype(根据错误消息。

    要解决这个问题,您只需在 Update 方法中消除该分配。因为您是在属性中分配 FK ID,所以您也不需要分配对象。

    另一个关于 EF 的说明,还有一个 Find 方法,它只使用 ID 而不是 FirstOrDefault。优化了一点。

    internal void Update(SpecialDay sd)
    {
        using (SalDBContext _db = new SalDBContext())
        {
            var newsd = _db.SpecialDays.Find(p => p.SpecialDayID==sd.SpecialDayID);
            newsd.JanuaryDay = sd.JanuaryDay;
            ....
            newsd.DecemberDay = sd.DecemberDay;
            newsd.DayTypeId = sd.DayTypeId;
            // newsd.daytype = sd.daytype; Must be eliminated!
            try
            {
                _db.SaveChanges();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    

    【讨论】:

      【解决方案2】:

      您已经加载了 sd从方法头)与另一个上下文作为方法主体 newsd 中的上下文。因此,您在调用_db.SaveChanges(); 时收到异常。我想说的是newsd.daytype = sd.daytype;,因为它是一种复杂的数据类型,代表您的一个实体。删除该行并仅设置 ID 或重新加载对象sd 以供参考。

      你的修改版:

      internal void Update(SpecialDay sd)
      {
          using (SalDBContext _db = new SalDBContext())
          {
              var newsd = _db.SpecialDays.FirstOrDefault(p => p.SpecialDayID==sd.SpecialDayID);
              newsd.JanuaryDay = sd.JanuaryDay;
              // ...
              newsd.DecemberDay = sd.DecemberDay;
              // set only the id to reference the object
              newsd.DayTypeId = sd.DayTypeId;
              // newsd.daytype = sd.daytype;
              try
              {
                  _db.SaveChanges();
              }
              catch (Exception ex)
              {
                  MessageBox.Show(ex.ToString());
              }
          }
      }
      

      好吧,我迟到了几秒钟。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-02
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        相关资源
        最近更新 更多