次のビュー モデルにバインドされている ASP.Net MVC フォームがあります。このフォームを使用すると、1 回の送信で、すべての電話番号と予定の種類と共に新しいスタッフ レコードを挿入できます。コントローラーの [HttpPost] アクションは、LINQ to SQL を使用して、EContactInfo および AppointmentType テーブルを除く、 People (別名 Staff) テーブルに関連付けられているテーブルに単一レコードを挿入できます。_StaffSerivce.Add() は、データ リポジトリでそのエンティティの InsertOnSubmit() を実行するだけです。すべての新しいレコードが追加された後、_Service.Save() が呼び出され、データ リポジトリの SubmitChanges() が実行されます。そのとき、「既に使用されているキーを持つエンティティを追加できません」というエラーが表示されました「。エラーは、最初の電話番号または予定の種類を挿入するときに発生します。最初のレコードがそれぞれのテーブルに挿入された後、これらのテーブルの主キーは変更されません。多くのレコードを 1 つのテーブルにバッチ挿入するにはどうすればよいですか?ありがとう.
public class RequestForAppointmentViewModel
{
public People Staff { get; set; } /* Person to be appointed or employeed */
public Appointment Appointment { get; set; }
public ContactAddress PostAddress { get; set; }
//public IList<EContactInfo> ContactMethods { get; set; }
public string WorkPhone { get; set; }
public string HomePhone { get; set; }
public string CellPhone { get; set; }
public string Pager { get; set; }
public string EmailAddress { get; set; }
//public IList<AppointmentType> AppointmentTypes { get; set; }
public bool ChiefResident { get; set; }
public bool CompPen { get; set; }
public bool Consultant { get; set; }
public bool ContractAppointmentType { get; set; }
public bool FeeBasis { get; set; }
public bool Locum { get; set; }
public bool SpecialFellow { get; set; }
public bool StaffAppointmentType { get; set; }
public bool StaffFullTime { get; set; }
public bool StaffIntermittent { get; set; }
public bool StaffPartTime { get; set; }
public bool StaffPermanent { get; set; }
public bool StaffTemporary { get; set; }
public bool WOC { get; set; }
public Contract Contract { get; set; }
public ContractingCompany ContractingCompany { get; set; } /* person is via contracting company */
}
ポストバック アクションには次のものがあります。
[HttpPost]
public ActionResult CreateRequestForAppointment(RequestForAppointmentViewModel requestForm)
{
bool success = false;
string alpha = string.Empty;
if (!ModelState.IsValid)
return View("RequestForAppointment", requestForm);
else
{
try
{
People thisPerson = new People();
if (TryUpdateModel<People>(thisPerson, "Staff")) //prefixed
{
#region persist People
_staffService.Add(thisPerson);
alpha = thisPerson.LName.Substring(0, 1);
#endregion persist People
#region persist Appointment
Appointment thisAppointment = new Appointment();
if (TryUpdateModel<Appointment>(thisAppointment, "Appointment"))
{
thisAppointment.People = thisPerson;
_staffService.Add(thisAppointment);
}
#endregion persist Appointment
#region persist ContactAddress
ContactAddress thisAddress = new ContactAddress();
if (TryUpdateModel<ContactAddress>(thisAddress, "PostAddress"))
{
thisAddress.People = thisPerson;
thisAddress.Country = _staffService.ListCountries().SingleOrDefault(c => c.CountryName.Equals("USA"));
_staffService.Add(thisAddress);
}
#endregion persist ContactAddress
#region persist Contract Company
ContractingCompany thisCompany = new ContractingCompany();
if (TryUpdateModel<ContractingCompany>(thisCompany, "ContractingCompany"))
{
_staffService.Add(thisCompany);
}
#endregion persist Contract Company
#region persist Contract
Contract thisContract = new Contract();
if (TryUpdateModel<Contract>(thisContract, "Contract"))
{
thisContract.Appointment = thisAppointment;
thisContract.ContractingCompany = thisCompany;
_staffService.Add(thisContract);
}
#endregion Persist Contract
#region persist EContactInfo
if (!string.IsNullOrWhiteSpace(requestForm.WorkPhone))
{
EContactInfo WorkPhone = new EContactInfo();
WorkPhone.People = thisPerson;
WorkPhone.CodeReference = _staffService.ListMessagingMethods().SingleOrDefault(m => m.Description.Equals("Work Phone"));
WorkPhone.ContactDetail = requestForm.WorkPhone;
_staffService.Add(WorkPhone);
}
if (!string.IsNullOrWhiteSpace(requestForm.HomePhone))
{
EContactInfo HomePhone = new EContactInfo();
HomePhone.People = thisPerson;
HomePhone.CodeReference = _staffService.ListMessagingMethods().SingleOrDefault(m => m.Description.Equals("Home Phone"));
HomePhone.ContactDetail = requestForm.HomePhone;
_staffService.Add(HomePhone);
}
//others phones are omitted for abbreviation
#endregion persist EContactInfo
#region persist AppointmentType
if (requestForm.ChiefResident.Equals(true))
{
AppointmentType ChiefResident = new AppointmentType();
ChiefResident.Appointment = thisAppointment;
ChiefResident.CodeReference = _staffService.ListAppointmentTypes().SingleOrDefault(t => t.Description.Equals("Chief Resident (CRES)"));
_staffService.Add(ChiefResident);
}
if (requestForm.CompPen.Equals(true))
{
AppointmentType CompPen = new AppointmentType();
CompPen.Appointment = thisAppointment;
CompPen.CodeReference = _staffService.ListAppointmentTypes().SingleOrDefault(t => t.Description.Equals("Comp & Pen (C&P)"));
_staffService.Add(CompPen);
}
//Other types omitted for abbreviation
#endregion persist AppointmentType
_staffService.Save();
success = true;
}
}
リポジトリのメソッドは次のとおりです。
public class ClinicalPrivilegeRepository : IClinicalPrivilegesRespository
{
private DB db = new DB();
#region EContactIfo
public IQueryable<EContactInfo> GetEContactInfoByPersonId(int id)
{
var eContactInfos = (from e in db.EContactInfos
select e).Where(e => e.FK_People.Equals(id));
return eContactInfos;
}
public EContactInfo GetEcontactInfoById(int id)
{
var eContactInfo = (from e in db.EContactInfos
select e).SingleOrDefault(e => e.PKey.Equals(id));
return eContactInfo;
}
public void Add(EContactInfo newEContactInfo)
{
db.EContactInfos.InsertOnSubmit(newEContactInfo);
}
public void Delete(EContactInfo thisEContactInfo)
{
db.EContactInfos.DeleteOnSubmit(thisEContactInfo);
}
#endregion EContactIfo
#region StaffAppointmentType
public IQueryable<AppointmentType> ListStaffAppointmentTypes(int appointmentId)
{
IQueryable<AppointmentType> appointmentTypes = (db.AppointmentTypes.Where(t => t.FK_Appointment.Equals(appointmentId)).Select(t => t));
return appointmentTypes;
}
public AppointmentType GetStaffAppointmentType(int appointmentId, int appointmentTypeId)
{
var appointmentType = (from t in ListStaffAppointmentTypes(appointmentId)
select t).SingleOrDefault(x=>x.FK_AppointmentType.Equals(appointmentTypeId));
return appointmentType;
}
public void Add(AppointmentType newAppointmentType)
{
db.AppointmentTypes.InsertOnSubmit(newAppointmentType);
}
public void Delete(AppointmentType thisAppointmentType)
{
db.AppointmentTypes.DeleteOnSubmit(thisAppointmentType);
}
#endregion StaffAppointmentType
public void Save()
{
//throw new NotImplementedException();
db.SubmitChanges();
}
}
}