0

だから私はこのモデルhttp://i.imgur.com/tz8ZVPT.pngを持っていて、プログラムで更新を作成したいので、最初に更新を作成し、必要なすべての項目を入力し、MachineType を見つけて、おそらくプログラムですが、何も見つからない場合は、MachineType から最初のプログラムを取得します。注: すべての MachineType には、少なくとも 1 つのプログラムがあります。

        for (int i = 0; i < dgvInput.Rows.Count; i++)
        {
            DataGridViewRow row = dgvInput.Rows[i];
            int machineTypeId = Convert.ToInt32(row.Cells[1].Value);
            Update update = new Update();
            update.MachineType.Add(Check.prombase.MachineTypes.First(mt => mt.MachineTypeId == machineTypeId));
            foreach (Program program in database.Programs)
            {
                if (program.ProgramVersion.Split('v')[0] == row.Cells[5].Value.ToString())
                {   //If a program is added here, it will save it
                    update.Program.Add(program);
                    break;
                }
            }
            if (update.Program.Count == 0)
                foreach (Program program in database.Programs)
                {   //When a program is added here, it will NOT save it
                    if (program.MachineType.MachineTypeId == machineTypeId)
                    {
                        update.Program.Add(program);
                        break; //When debugging it comes here everytime
                    }
                }
            //Here it is always: update.Program.Count = 1
            database.AddToUpdates(update);
            database.SaveChanges();

            if (update.MachineType.Count == 0 || update.Program.Count == 0)
                MessageBox.Show("This error is nevers shown!");
        }

問題は、常にプログラムがあると言っていますが、実際にはそうではないことです。アップデートにプログラムが追加されないのは、何が悪いのですか?

edit VARAK: コードを置き換えた後も保存されません。これも最後に追加しました

reloadDatabase();

foreach(Update update in database.Updates)
    if (update.Program.Count == 0)
        MessageBox.Show("This can't be happening");
4

2 に答える 2

1

これを試してください:

for (int i = 0; i < dgvInput.Rows.Count; i++)
    {
        DataGridViewRow row = dgvInput.Rows[i];
        int machineTypeId = Convert.ToInt32(row.Cells[1].Value);
        Update update = new Update();
        update.MachineType.Add(Check.prombase.MachineTypes.First(mt => mt.MachineTypeId == machineTypeId));

        var programVal = row.Cells[5].Value.ToString() + "v";

        var program = database.Programs.FirstOrDefault(prog => prog.ProgramVersion.StartsWith(programVal));

        if (program == null)
            program = database.Programs.First(prog => prog.MachineType.MachineTypeId == machineTypeId);

        update.Program.Add(program);            

        database.AddToUpdates(update);
        database.SaveChanges();

        //This will never show an error as the update that you are accessing here is the one you created in memory (Not the one in the DB)
        if (update.MachineType.Count == 0 || update.Program.Count == 0)
            MessageBox.Show("This will never show!");

        //To get the error, pull the update from the database again
        var updateNew = database.Updates.First(upd => upd.UpdateId == update.UpdateId);
        if (updateNew.MachineType.Count == 0 || updateNew.Program.Count == 0)
            MessageBox.Show("This will show if prog was not saved");

    }

このコードはより効率的であるはずであり、機能しない場合はもう少し光を当てる可能性があります.

于 2013-03-11T10:10:41.733 に答える
0

最後に解決策を見つけました。私のモデルでわかるように、プログラムは1つの更新を持つことができるため、新しい更新が別の更新と同じプログラムで作成されると、他の更新は接続されたプログラムを失います。

于 2013-03-27T14:50:57.900 に答える