2010-09-03 2 views
3

Это должно быть довольно просто.Задача кэширования LINQ to SQL

У меня есть LINQ к SQL (C# 3.5/SQL Server) работает хорошо, с простым соотношением в месте между двумя таблицами Конференции и ConferenceAttendees.

Я уже создал и совершил конференцию, затем добавить 3 ConferenceAttendees используя следующий код (повторяется 3 раза):

прекрасно работает, и я вижу 3 новых посетителей появляются в базы данных.

UPDATE: Затем, используя совершенно новый DataContext, я стараюсь следующим:

string Names = String.Empty; 
Conference RequestedConference = db.Conferences.FirstOrDefault(x => x.ConferenceId == ConferenceID); 
    foreach (ConferenceAttendee Attendee in RequestedConference.ConferenceAttendees) 
     Names += Attendee.Name + ", "; 

Но он не имеет какое-либо связанное с Attendees присоединенного к нему! (Они определенно существуют в базе данных и были совершены). Но RequestedConference.ConferenceAttendees всегда имеет счетчик 0 поэтому цикл никогда не вошел ..

foreach (ConferenceAttendee Attendee in this.ConferenceAttendees) 
{ Names += Attendee.Name; } 

Я делаю это внутри частичного класса конференции, с помощью метода я сделал под названием PrintAllAttendeeNames().

Что я делаю неправильно и почему этот свежий datacontext не видит эти связанные объекты через LINQ, когда они уже зарегистрированы в базе данных?

(Примечание: Я уже пытался дозвониться

db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 

без толку ..)

Большое спасибо

Исповедь UPDATE

Я абсолютный дебил. У меня была установка dataContext как статическая. Обычно я этого не делаю, поэтому у меня обычно нет проблем с ленивой загрузкой.

Я это:

public static MyDataContext db = new MyDataContext(ConfigurationManager.ConnectionStrings["MyDBConnection"].ConnectionString); 

Конечно, изменить его на это решить проблему !!!

public MyDataContext db = new MyDataContext(ConfigurationManager.ConnectionStrings["MyDBConnection"].ConnectionString); 

ответ

1

Пара вещей. Во-первых, вы должны отправлять свои изменения только после внесения всех изменений. Вам не нужно звонить SubmitChanges каждый раз, когда вы создаете нового участника. Сначала создайте все три, InsertOnSubmit, затем сделайте один звонок до SubmitChanges. LINQ to SQL будет генерировать более эффективные, более короткие вызовы.

Во-вторых, я немного запутался в вопросе загрузки участников. Они должны лениться на первый доступ к объекту Attendee. Каждая отдельная Конференция будет подвергать отдельный запрос, когда его свойство будет впервые доступно, поэтому это не самый эффективный способ справиться с этим. Вы можете сказать L2S предварительно загрузить всех участников для каждого объекта конференции, который вы загружаете.Вы бы сделали это с классом DataLoadOptions:

using (var context = new SomeContext(...)) 
{ 
    var options = new DataLoadOptions(); 
    options.LoadWith<Conference>(c => c.ConferenceAttendees); 

    context.LoadOptions = options; 

    var conferencesWithAttendees = from c in context.Conferences 
            where c.Year = DateTime.Now.Year 
            select c; 

    foreach (var conferenceWithAttendee in conferencesWithAttendees) 
    { 
     conferenceWithAttendee.PrintAllAttendeeNames(); 
    } 
} 
+0

Спасибо за первый вопрос, о котором я должен знать, и я буду делать с этого момента. У меня все еще есть проблемы. Да, ленивая загрузка обычно отлично подходит для меня. Это должно быть что-то очень простое! См. Выше: я обновил, чтобы объяснить код, который я использую для загрузки на конференции, и повторить его через Участников. Но граф всегда 0! – Aaron

+0

Я идиот. Я объявил dataContext статичным !!! GRRR !!! Большое спасибо за вашу помощь и жаль тратить ваше время. 1 балл. – Aaron

+0

Вообще говоря, DataContext НИКОГДА не должен держаться дольше, чем время, необходимое для выполнения какой-либо работы. DataContext является единицей рабочего класса, поэтому сделать его полем или свойством класса является плохая идея. Создавайте как можно раньше, распоряжайтесь как можно раньше и создавайте новый экземпляр каждый раз, когда выполняете работу в блоке. – jrista