/// <summary> /// prepare data and save to ef, ใช้ทั้ง update และ insert /// </summary> /// <param name="crew"></param> /// <param name="isCreate">ส่ง true ถ้าต้องการ insert</param> public void DoSave(Crew crew, bool isCreate) { if (isCreate) { //ถ้า Insert แต่ Alien มีค่าอยู่แล้ว ต้องเอาออกก่อน ไม่งั้นจะ add Alien เข้าไปด้วย if (crew.AlienId != 0) { var updatedAlien = crew.Alien; crew.Alien = null; //ให้ไป update ที่ alien โดยตรง var oldAlien = entities.Aliens.Single(a => a.Id == crew.AlienId); entities.Aliens.Attach(oldAlien); updatedAlien.Photo.CopyFrom(oldAlien.Photo); //ต้อง copy ถ่ายค่าของรูปภาพมาด้วย เพราะไม่มีข้อมูลเก็บในหน้าจอ entities.Aliens.ApplyCurrentValues(updatedAlien); } _add(crew); } _doBeforePost(crew, isCreate); _validate(crew, isCreate); _saveCheckCode(crew); }
private void _updateCrews(ConveyanceInOut convInOut) { //หารายการลูกเรือคราวที่แล้ว //เริ่มต้นที่การหาวันที่ล่าสุดของเรือที่กำหนด //th20110409 แก้ Bug กรณีที่มีเรือ แต่ไม่มีรายการเข้าออก จะ error เนื่องจาก query นี้ให้ค่า null DateTime?maxInOutdate = entities.Crews .Where(c => (c.ConveyanceInOut != null) && (c.ConveyanceInOut.ConveyanceId == convInOut.ConveyanceId) && (c.ConveyanceInOut.InOutDate <= convInOut.InOutDate) && //th20110409 เอาเฉพาะอันที่เก่ากว่าด้วย เผื่อ user key ย้อนหลัง //th ไม่ต้องกรองอันนี้ เรือเข้าก็เอาชุดเก่าที่เคยออกไปมาให้ได้ (c.ConveyanceInOut.InOutType == ModelConst.CONVINOUT_IN) && //th20110409 กรองเฉพาะเรือเข้า (c.IsCrew ?? false) && !c.IsCancel) .Max(c => (DateTime?)c.ConveyanceInOut.InOutDate); if (maxInOutdate == null) //ถ้าไม่มี record เก่า ไม่ต้องทำต่อ { return; } //หา id ของรายการเข้าออกเรือ int?maxConveyanceInOutId = entities.ConveyanceInOuts .Where(c => !c.IsCancel && c.ConveyanceId == convInOut.ConveyanceId && //th20110409 ควรจะต้องกรองเฉพาะเรือลำเดิมเท่านั้น ไม่งั้น ถ้ามีหลายลำเข้าวันเดียวกัน ก็จะเอามามั่ว c.InOutDate == maxInOutdate) .Max(c => (int?)c.Id); if (maxConveyanceInOutId == null) { return; } //ท่อนที่ 1 เอาลูกเรือตรง ๆ เข้ามาใส่ var lastcrews = (from c in entities.Crews where (c.ConveyanceInOut.ConveyanceId == convInOut.ConveyanceId) && (c.IsCrew ?? false) && !c.IsCancel && (c.ConveyanceInOut.Id == maxConveyanceInOutId) && //หาพวกที่ไม่ได้อยู่ใน remove ของคราวที่แล้ว !(from d in entities.AddRemoveCrews where !d.IsCancel && (d.ConveyanceInOutId == maxConveyanceInOutId) && (d.AddRemoveType == ModelConst.ADDREMOVETYPE_RMV) //เอาเฉพาะรายการลด select d.AlienId).Contains(c.AlienId) select c).ToList(); foreach (var crew in lastcrews) { //entities.Crews.Attach(crew); //entities.Crews.ApplyCurrentValues(crew); var newcrew = new Crew(); newcrew.Code = crew.Code; newcrew.AlienId = crew.AlienId; newcrew.PassportCard.DocNo = crew.PassportCard.DocNo; //th20110411 เพิ่มการ copy id และ seaman Req 2 newcrew.IDCardNo = crew.IDCardNo; newcrew.SeamanCardNo = crew.SeamanCardNo; newcrew.IsCrew = crew.IsCrew; newcrew.IsCancel = crew.IsCancel; newcrew.Remark = crew.Remark; //th20110409 newcrew.ConveyanceInOut = convInOut; newcrew.UpdateInfo.LogAdded(CurrentUserName); newcrew.UpdateInfo.LogUpdated(CurrentUserName); entities.Crews.AddObject(newcrew); } //th20110409 ท่อนที่ 2 ถ้าเป็นขาเข้า เอาคนเพิ่มจากคราวที่แล้ว มาใส่ด้วย if (convInOut.InOutType == ModelConst.CONVINOUT_IN) { var lastAddCrews = from d in entities.AddRemoveCrews where !d.IsCancel && (d.ConveyanceInOutId == maxConveyanceInOutId) && (d.AddRemoveType == ModelConst.ADDREMOVETYPE_ADD) //เอาเฉพาะรายการเพิ่ม select d; foreach (var addCrew in lastAddCrews) { if (!lastcrews.Any(lc => lc.AlienId == addCrew.AlienId)) //เอาคนที่ซ้ำกับ list 1 ออกไป { //entities.Crews.Attach(crew); //entities.Crews.ApplyCurrentValues(crew); var newcrew = new Crew(); newcrew.Code = addCrew.Code; newcrew.AlienId = addCrew.AlienId; newcrew.PassportCard.DocNo = addCrew.Alien.PassportCard.DocNo; //th20110411 เพิ่มการ copy id และ seaman Req 2 newcrew.IDCardNo = addCrew.Alien.IDCardNo; newcrew.SeamanCardNo = addCrew.Alien.SeamanCardNo; newcrew.IsCrew = true; newcrew.IsCancel = addCrew.IsCancel; newcrew.Remark = addCrew.ExtendedData.Custom1; //th20110409 newcrew.ConveyanceInOut = convInOut; newcrew.UpdateInfo.LogAdded(CurrentUserName); newcrew.UpdateInfo.LogUpdated(CurrentUserName); entities.Crews.AddObject(newcrew); } } } }
/// <summary> /// สำหรับลบ record ออกจาก ef รวมทั้งลบลูกที่เกี่ยวข้อง (ถ้ามี) /// </summary> /// <param name="crew"></param> private void _delete(Crew crew) { // ถ้ามี ref ตัวลูก ให้ loop ลบ ref ก่อน... //entities.ConveyanceInOuts.DeleteObject(crew); crew.IsCancel = true; }
// // Insert / Delete Method /// <summary> /// สำหรับเพิ่ม record ลง ef /// </summary> /// <param name="crew"></param> private void _add(Crew crew) { entities.Crews.AddObject(crew); }
/// <summary> /// prepare data and delete from ef /// </summary> /// <param name="crew"></param> public void DoDelete(Crew crew) { _delete(crew); _save(); }