我有一个绑定到以下视图模型的 ASP.Net MVC 表单。该表格允许一个提交插入一个新的员工记录以及他的所有电话号码和约会类型。使用 LINQ to SQL 的控制器 [HttpPost] 操作可以对与 People(aka Staff) 表关联的表执行单条记录插入,但 EContactInfo 和 AppointmentType 表除外。_StaffSerivce.Add() 只是在数据存储库中执行该实体的 InsertOnSubmit()。添加完所有新记录后,将在执行数据存储库的 SubmitChanges() 的地方调用 _Service.Save()。那时我收到一条错误消息“无法使用已在使用的密钥添加实体“。错误是在插入第一个电话号码或约会类型时,在相应表中插入第一条记录后,这些表的主键没有更改。如何将多条记录批量插入一个表中?谢谢。
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();
}
}
}