62,025
社区成员
发帖
与我相关
我的任务
分享
//文章
public class Paper
{
public Paper()
{
ReaderAs = new HashSet<ReaderA>();
ReaderBs = new HashSet<ReaderB>();
}
public int ID { get; set; }
public string Title { get; set; }
public virtual ICollection<ReaderA> ReaderAs { get; set; }
public virtual ICollection<ReaderB> ReaderBs { get; set; }
}
//A类读者
public class ReaderA
{
public int ID { get; set; }
public string Name { get; set; }
public int? PaperID { get; set; }
public Paper Paper { get; set; }
}
//B类读者
public class ReaderB
{
public int ID { get; set; }
public string Name { get; set; }
public Paper Paper { get; set; }
}
Paper paper = new Paper
{
Title = "paper01"
};
ReaderA readerA = new ReaderA
{
Name = "readerA"
};
ReaderB readerB = new ReaderB
{
Name = "readerB"
};
paper.ReaderAs.Add(readerA);
paper.ReaderBs.Add(readerB);
dbContext.Papers.Add(paper);
dbContext.SaveChanges();
Debug.WriteLine("ReaderA:{0}", dbContext.Entry<ReaderA>(readerA).State);
Debug.WriteLine("ReaderB:{0}", dbContext.Entry<ReaderB>(readerB).State);
Debug.WriteLine("");
readerA.Paper = null;
//readerA.PaperID = null; //the same
readerB.Paper = null;
//dbContext.ChangeTracker.DetectChanges(); //the same
Debug.WriteLine("ReaderA:{0}", dbContext.Entry<ReaderA>(readerA).State);
Debug.WriteLine("ReaderB:{0}", dbContext.Entry<ReaderB>(readerB).State);
Debug.WriteLine("");
Console.WriteLine("press any key to save");
Console.ReadKey();
dbContext.SaveChanges();
exec sp_executesql N'UPDATE [dbo].[ReaderA]
SET [PaperID] = NULL
WHERE ([ID] = @0)
',N'@0 int',@0=1
exec sp_executesql N'UPDATE [dbo].[ReaderB]
SET [Paper_ID] = NULL
WHERE (([ID] = @0) AND ([Paper_ID] = @1))
',N'@0 int,@1 int',@0=1,@1=1
readerA.Paper = null; //the same
//readerA.PaperID = null;
readerB.Paper = null;
//readerB.Name = "fucking";
//dbContext.ChangeTracker.DetectChanges(); //the same
Debug.WriteLine("ReaderA:{0}", dbContext.Entry<ReaderA>(readerA).State);
Debug.WriteLine("ReaderB:{0}", dbContext.Entry<ReaderB>(readerB).State);
Debug.WriteLine("");
var objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
Debug.WriteLine("ReaderA:{0}", objContext.ObjectStateManager.GetObjectStateEntry(readerA).State);
Debug.WriteLine("ReaderB:{0}", objContext.ObjectStateManager.GetObjectStateEntry(readerB).State);
Debug.WriteLine("");
Console.WriteLine("press any key to save");
Console.ReadKey();
试过了,使用ObjectContet获取到的状态和DBContext一样
ReaderA_db:Modified
ReaderB_db:Unchanged
ReaderA_obj:Modified
ReaderB_obj:Unchanged
我就纳闷了,EF是到底是跟踪到变化的呢,求正解