ObjectContext 对象错误 - EF
ObjectContext object error- EF
我有两个用 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();
异常:
{"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."} System.Exception {System.InvalidOperationException}
如果能帮助解决我的问题,我将不胜感激。谢谢
如例外情况所述,
"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."
查看那里的代码,您正在将 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());
}
}
您已经加载了 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());
}
}
}
嗯,我迟到了几秒钟。 :)
我有两个用 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();
异常:
{"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."} System.Exception {System.InvalidOperationException}
如果能帮助解决我的问题,我将不胜感激。谢谢
如例外情况所述,
"The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."
查看那里的代码,您正在将 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());
}
}
您已经加载了 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());
}
}
}
嗯,我迟到了几秒钟。 :)