0

次のビュー モデルにバインドされている 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();
    }
}

}

4

1 に答える 1

0

コードはほとんど正しいです。実際の問題は、DBML の EContactInfo テーブルと AppointmentType テーブルにあり、主キーの ID を true に設定するのを忘れていました。

于 2012-07-04T22:22:15.047 に答える