我是实体框架的新手。
我在这个网站和谷歌上搜索过,然后才问这个问题,到处都找到了不同的答案。但我的问题没有解决,所以我问这个问题。
我在尝试删除记录时遇到上述错误。
这是我的代码:
using (Lab_Lite_Entities db = new Lab_Lite_Entities())
{
var HaemogramsCorrespondingToPatient = (from h in db.Haemograms
join m in db.MasterPatientHaemograms
on h.HaemogramID equals m.HaemogramID
where m.PatientID == SelectedPatient.PatientID
select h);
foreach (Haemogram haemogram in HaemogramsCorrespondingToPatient)
{
if (db.Entry(haemogram).State == System.Data.EntityState.Detached)
db.Haemograms.Attach(haemogram);
db.Haemograms.Remove(haemogram);
db.Entry(haemogram).State = EntityState.Deleted;
}
var entry = db.Entry(SelectedPatient);
if (entry.State == System.Data.EntityState.Detached)
db.Patients.Attach(SelectedPatient); //I get error here
db.Patients.Remove(SelectedPatient);
db.SaveChanges();
}
以下是表格之间的关系:
注意:请注意,在sql server中启用了级联删除。
修改
我也发现了一些奇怪的事情。
当我创建患者然后尝试使用上述代码删除CurrentPatient
对象时,我得到上述错误。
但是当我创建一个病人然后重新启动程序然后我尝试删除CurrentPatient
对象时,它会被删除而没有任何问题。
答案 0 :(得分:2)
我只能想象如果SelectedPatient
包含MasterPatientHaemogram
类型的引用对象,并且这些对象再次引用类型为Haemogram
的对象,则会发生此错误。当您附加SelectedPatient
(显然是一个分离的实体)时,将附加整个对象图,包括Haemogram
个对象,这些对象可能与您在HaemogramsCorrespondingToPatient
的查询中已加载的密钥相同。这会导致异常。
最简单,最安全的解决方案是不要尝试附加分离的SelectedPatient
,而是从数据库加载副本并删除此实体:
//...
var patient = db.Patients.Find(SelectedPatient.PatientID);
db.Patients.Remove(patient);
db.SaveChanges();
如果您不想使用Find
查询数据库,只需使用正确的密钥创建存根实体:
//...
var patient = new Patient { PatientID = SelectedPatient.PatientID };
db.Patients.Attach(patient);
db.Patients.Remove(patient);
db.SaveChanges();