2

私はエンティティフレームワークを初めて使用し、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の応答に基づいて更新された作業コードは次のとおりです。1)Typeを削除してから、結果をループして新しいオブジェクトにデータを入力します。

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

}
4

1 に答える 1

3

The reason is here:

                      select new Prediction
                      {
                          Member = memberQuery.member,

These lines will (once the IEnumerable is iterated; LINQ is lazy) :

  1. Instantiate a new Prediction
  2. Associate that Prediction with an existing Member, *which is attached to db.

Associating an instance of an entity with an attached entity automatically adds that entity to the context of the associated, attached entity.

So as soon as you start iterating over predictionArray, the code above executes and you have a new entity in your context.

于 2010-03-12T14:15:11.937 に答える