Почему 2 разных объекта ссылаются на один и тот же объект? - PullRequest
1 голос
/ 09 марта 2011

Я использую Linq To Entities , чтобы получить 2 объекта m1 & m2. И я не понимаю, почему 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 MC Данные таблицы конфигурации

MConfiguration_Content

Данные таблицы держателей ____________________________________________________________________________ Данные таблицы шаблонов

Holder_Content _____________________________________ Template_Content

1 Ответ

0 голосов
/ 09 марта 2011

Ссылка на объекты гарантирует, что в заданном контексте, если вы получите тот же объект (по первичному ключу в БД), вы получите тот же объект.

Вы увидите такое же поведение, если несколько раз выбирали строку из таблицы шаблонов. Вы всегда будете возвращать один и тот же экземпляр всякий раз, когда будете повторно запрашивать любой объект.

Это дает вам преимущества в производительности за счет кэширования и предотвращает конфликты при нескольких изменениях одного и того же объекта в одном и том же контексте.

...