سؤال

أنا جديد على إطار الكيان وأنا مرتبك حقا حول كيفية عمل Savechanges. ربما يكون هناك الكثير من التعليمات البرمجية في مثالتي التي يمكن تحسينها، لكن هذه المشكلة التي أواجهها.

يدخل المستخدم حفنة من اللقطات. أتأكد من أن المستخدم لم يدخل بالفعل تلك اللقطات. ثم أضفت اللقطات إلى قاعدة البيانات.

       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()

من الواضح أن هناك شيئا ما يحدث مع السياق الذي لا أفهمه. أعتقد أنني قمت بتحميل اختياراتي الجديدة بطريقة ما هي التغييرات المعلقة، ولكن حتى لو كان هذا صحيحا، فلا أفهم أنه لا بد لي من الحلقة عنها لحفظ التغييرات.

يمكن للشخص أن يفسر هذا لي؟

فيما يلي رمز العمل المحدث بناء على ردود Craig's: 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)
                   }

}
هل كانت مفيدة؟

المحلول

السبب هو هنا:

                      select new Prediction
                      {
                          Member = memberQuery.member,

هذه الخطوط سوف (مرة واحدة IEnumerable يتم تكرارها لينك كسول):

  1. إرسال جديد Prediction
  2. ربط ذلك Prediction مع موجودة Member, ، * وهو مرتبط db.

ربط مثيل كيان مع كيان مرفق تلقائيا يضيف هذا الكيان إلى سياق الكيان المرفق المرتبط.

بمجرد أن تبدأ التكرار predictionArray, ، ينفذ التعليمات البرمجية أعلاه ولديك كيان جديد في سياقك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top