2011-03-09 76 views
1

我使用Linq To实体获得2个物体m1 & m2。 而我不明白为什么2个不同的对象参考相同的表模板表。为什么2个不同的实体引用同一个对象?

我怀疑是因为MConfigOnPage1,MConfigOnPage2与MConfiguration之间的连接。也许它应该以某种方式分裂?

我附上我的ERD和代码。

我将不胜感激为什么发生这种情况?

谢谢

var cxt = new Entities(); 
//this returns MConfiguration with Id=19 
var m1 = (from mop in cxt.MConfigOnPage1 
      where mop.SiteMapId == 15 && mop.HolderId == 13           
      select mop.MConfiguration).FirstOrDefault(); 
//this returns MConfiguration with Id=40  
var m2 = (from mop in cxt.MConfigOnPage2 
      where mop.SiteMapId == 15 && mop.HolderId == 1           
      select mop.MConfiguration).FirstOrDefault(); 

var t1 = m1.Holder.Template; 
var t1.Code = 13; 
var t2 = m2.Holder.Template; 
//I expect that **t2.Code** to be 0, but it equals 13 
//This behavior tells me that m1 & m2 reference the same Template object, 
// BUT shouldn't m1 & m2 to have their own Template objects? 

ERD

SQL-ERD MConfiguration表数据

MConfiguration_Content

持有人数据表 ____________________________________________________________________________ 模板表数据

Holder_Content _____________________________________ Template_Content

回答

0

链接到实体确保,给定的范围内,如果您获取相同的实体(在DB主键),你会得到相同的对象。

您会看到同样的行为是您多次从模板表中选择了该行。每当你重新查询任何对象时,你总是会得到相同的实例。

这可以通过缓存提供性能优势,并防止在同一上下文中导致冲突的同一对象的多次编辑。

+0

m1&m2是从** DIFFERENT **表中提取的,它们如何具有相同的对象? – theateist 2011-03-09 11:29:15

+0

它也是我所指的Template类型的对象。在你的例子中,t1和t2都指向Template表中的同一行。试试m1.Holder == m2.Holder && m1.Holder.Template == m2.Holder.Template。 – 2011-03-10 22:26:59

相关问题