LINQ to SQL проблема кеширования - PullRequest
3 голосов
/ 03 сентября 2010

это должно быть довольно просто.

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

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

ConferenceAttendee NewAttendee = new ConferenceAttendee();
NewAttendee.ConferenceId = ConferenceID;
NewAttendee.Name = ContactName;
NewAttendee.Email = ContactEmail;
db.ConferenceAttendees.InsertOnSubmit(NewAttendee);
db.SubmitChanges();

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

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

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

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

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

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

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

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

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

безрезультатно ..)

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

КОНФЕССИЯ ОБНОВЛЕНИЕ

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

У меня было это:

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

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

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

1 Ответ

1 голос
/ 03 сентября 2010

Пара вещей.Во-первых, вы должны отправлять свои изменения только после внесения всех изменений.Вам не нужно звонить 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...