.Net Entity Framework SaveChanges добавляет без добавления метода - PullRequest
2 голосов
/ 12 марта 2010

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

Пользователь вводит кучу пиков.Я уверен, что пользователь еще не ввел эти выборы.Затем я добавляю выборки в базу данных.

       var db = new myModel()
       var predictionArray = ticker.Substring(1).Split(','); // Get rid of the initial comma.

        var user = Membership.GetUser();
        var userId = Convert.ToInt32(user.ProviderUserKey);

        // Get the member with all his predictions for today.
        var memberQuery = (from member in db.Members
                         where member.user_id == userId
                         select new
                                    {
                                        member,
                                        predictions = from p in member.Predictions
                                                     where p.start_date == null
                                                     select p

                                    }).First();

        // Load all the company ids.
        foreach (var prediction in memberQuery.predictions)
        {
            prediction.CompanyReference.Load();
        }

 var picks = from prediction in predictionArray
                          let data = prediction.Split(':')
                          let companyTicker = data[0]
                          where !(from i in memberQuery.predictions
                                 select i.Company.ticker).Contains(companyTicker)
                          select new Prediction
                          {
                              Member = memberQuery.member,
                              Company = db.Companies.Where(c => c.ticker == companyTicker).First(),
                              is_up = data[1] == "up",  // This turns up and down into true and false.
                          };


    // Save the records to the database.
    // HERE'S THE PART I DON'T UNDERSTAND.
    // This saves the records, even though I don't have db.AddToPredictions(pick) 
            foreach (var pick in picks)
            {
                    db.SaveChanges();
            }

// This does not save records when the db.SaveChanges outside of a loop of picks.
 db.SaveChanges();
 foreach (var pick in picks)
            {

            }

// This saves records,  but it will insert all the picks exactly once no matter how many picks you have.  
//The fact you're skipping a pick makes no difference in what gets inserted.
            var counter = 1;
            foreach (var pick in picks)
            {
                if (counter == 2)
                {
                    db.SaveChanges();
                }
                counter++;
            }

Я тестировал, и SaveChanges даже не должен быть в цикле.Приведенный ниже код тоже работает.

foreach (var pick in picks)
            {
                   break;
            }

db.SaveChanges()

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

Может кто-нибудь объяснить это мне?

Вот обновленный рабочий код, основанный на ответах Крейга: 1) Удалите Тип, затем зациклите результаты и заполните новые объекты.

var  picks = (from prediction in predictionArray
                        let data = prediction.Split(':')
                        let companyTicker = data[0]
                        where !(from i in memberQuery.predictions
                                select i.Company.ticker).Contains(companyTicker)
                        select new //NO TYPE HERE
                        {
                            Member = memberQuery.member,
                            Company = db.Companies.Where(c => c.ticker == companyTicker).First(),
                            is_up = data[1] == "up",  // This turns up and down into true and false.
                        }).ToList();

            foreach (var prediction in picks)
            {
              if (includePrediction)
               {
                var p = new Prediction{
                  Member = prediction.Member,
                  Company = prediction.Company,
                  is_up = prediction.is_up
                 };
                db.AddToPredictions(p);
                }
            }

2) Или, если я не хочу, чтобы предсказаниябыть спасенным, я могу отделить предсказания.

foreach (var prediction in picks) {
                  if  (excludePrediction)
                  {
                      db.Detach(prediction)
                   }

}

1 Ответ

3 голосов
/ 12 марта 2010

Причина здесь:

                      select new Prediction
                      {
                          Member = memberQuery.member,

Эти строки будут (после итерации IEnumerable; LINQ будет ленивым):

  1. Создание нового Prediction
  2. Свяжите это Prediction с существующим Member, *, который присоединен к db.

Автоматическое связывание экземпляра объекта с подключенным объектом добавляет эту сущность в контекст связанной, присоединенной сущности.

Поэтому, как только вы начнете выполнять итерации по predictionArray, приведенный выше код будет выполнен, и у вас появится новая сущность в вашем контексте.

...