2009-09-02 3 views
1

내가 만든 일부 항목을 추가하려고합니다. 문제의 엔티티를 집합에 추가하면 (아래 코드 참조) 다음 오류가 발생합니다.EntityReference에는 일치하지 않는 EntityKey 속성 값이 있습니까?

"EntityReference의 EntityKey 속성 값이 EntityKey와 일치하지 않으므로 개체를 추가하거나 연결할 수 없습니다. 이 개체에 대해. "

내가 말하는 엔티티 키는 알 수 없습니다.

public Internship CreateInternship(Internship internshipToCreate) 
{ 
    try 
    { 
     Contact contactToCreate = new Contact(); 

     contactToCreate.Fax = internshipToCreate.contacts.Fax; 
     contactToCreate.Extension = internshipToCreate.contacts.Extension; 
     contactToCreate.FirstName = internshipToCreate.contacts.FirstName; 
     contactToCreate.MiddleName = internshipToCreate.contacts.MiddleName; 
     contactToCreate.LastName = internshipToCreate.contacts.LastName; 
     contactToCreate.PhoneNumber = internshipToCreate.contacts.PhoneNumber; 
     contactToCreate.StreetAddress = internshipToCreate.contacts.StreetAddress; 
     contactToCreate.PostalCode = internshipToCreate.contacts.PostalCode; 
     contactToCreate.ContactEmail = internshipToCreate.contacts.ContactEmail; 

     contactToCreate.statesReference.EntityKey = 
        new EntityKey("InternshipEntities.StateSet", "ID", internshipToCreate.contacts.states.ID); 
     contactToCreate.countriesReference.EntityKey = 
        new EntityKey("InternshipEntities.CountrySet", "ID", internshipToCreate.contacts.countries.ID); 

     _internshipEntities.AddToContactSet(contactToCreate); 
     _internshipEntities.SaveChanges(); 

     try 
     { 
      Availability availabilityToCreate = new Availability(); 

      availabilityToCreate.StartDate = internshipToCreate.availability.StartDate; 
      availabilityToCreate.EndDate = internshipToCreate.availability.EndDate; 
      availabilityToCreate.Negotiable = internshipToCreate.availability.Negotiable; 

      _internshipEntities.AddToAvailabilitySet(availabilityToCreate); 
      _internshipEntities.SaveChanges(); 

      try 
      { 
       internshipToCreate.contactsReference.EntityKey = 
        new EntityKey("InternshipEntities.ContactSet", "ID", contactToCreate.ID); 
       internshipToCreate.availabilityReference.EntityKey = 
        new EntityKey("InternshipEntities.AvailabilitySet", "ID", availabilityToCreate.ID); 
       internshipToCreate.classificationsReference.EntityKey = 
        new EntityKey("InternshipEntities.ClassificationSet", "ID", internshipToCreate.classifications.ID); 
       internshipToCreate.educationReference.EntityKey = 
        new EntityKey("InternshipEntities.EducationSet", "ID", internshipToCreate.education.ID); 

       _internshipEntities.AddToInternshipSet(internshipToCreate); //exception here 
       _internshipEntities.SaveChanges(); 

       return internshipToCreate; 
      } 
      catch(Exception e) 
      { 
       throw e; 
      } 
     } 
     catch(Exception e) 
     { 
      throw e; 
     } 
    } 
    catch(Exception e) 
    { 
     throw e; 
    } 

} 

내가 키가을 인 모르겠어요 그래서를 통해 추적 오차 외에 주어진 다른 정보가 없습니다 : 다음 코드는 잘 해낼 수있는 더 좋은 방법은 아마도이있다 발행물.

편집 :

using (TransactionScope scope = new TransactionScope()) 
{ 
    try 
    { 
     Contact contactToCreate = new Contact(); 
     Availability availabilityToCreate = new Availability(); 
     Internship i = new Internship(); 

     // Set the contact entity values; 

     contactToCreate.Fax = internshipToCreate.contacts.Fax; 
     //... 
     //ommited for brevity 
     //... 
     contactToCreate.ContactEmail = internshipToCreate.contacts.ContactEmail; 

     // Set the contact entity references to existing tables 

     contactToCreate.statesReference.EntityKey = 
        new EntityKey("InternshipEntities.StateSet", "ID", internshipToCreate.contacts.states.ID); 
     contactToCreate.countriesReference.EntityKey = 
        new EntityKey("InternshipEntities.CountrySet", "ID", internshipToCreate.contacts.countries.ID); 

     // Add contact 

     _internshipEntities.AddToContactSet(contactToCreate); 

     // Set the availability entity values; 

     availabilityToCreate.StartDate = internshipToCreate.availability.StartDate; 
     availabilityToCreate.EndDate = internshipToCreate.availability.EndDate; 
     availabilityToCreate.Negotiable = internshipToCreate.availability.Negotiable; 

     // Add availability 

     _internshipEntities.AddToAvailabilitySet(availabilityToCreate); 

     //Add contact and availability entities to new internship entity 

     i.contacts = contactToCreate; 
     i.availability = availabilityToCreate; 

     // Set internship entity values; 

     i.UserID = internshipToCreate.UserID; 
     //... 
     //ommited for brevity 
     //... 
     i.Created = DateTime.Now; 

     // Set the internship entity references to existing tables 

     i.classificationsReference.EntityKey = 
      new EntityKey("InternshipEntities.ClassificationSet", "ID", internshipToCreate.classifications.ID); 
     i.educationReference.EntityKey = 
      new EntityKey("InternshipEntities.EducationSet", "ID", internshipToCreate.education.ID); 

     // Add internship and save 

     _internshipEntities.AddToInternshipSet(i); 
     _internshipEntities.SaveChanges(); 

     //commit transaction 
     scope.Complete(); 

     return internshipToCreate; 

    } 
    catch (Exception e) 
    { 
     throw e; 
    } 
} 
+0

SaveChanges를 호출하면 오류가 발생합니다. –

+0

가장 안쪽의 try/catch, _internshipEntities.SaveChanges(); –

답변

2

가이 코드는 나에게 많은 의미를 만드는되지 않은 : 다음 작업 결국 버전입니다. 두 가지 경우에는 객체 참조를 할당 할 수있을 때 EntityKey를 거치게됩니다. 즉,이 설정을 변경 :

internshipToCreate.contactsReference.EntityKey = 
    new EntityKey("InternshipEntities.ContactSet", "ID", contactToCreate.ID); 
internshipToCreate.availabilityReference.EntityKey = 
    new EntityKey("InternshipEntities.AvailabilitySet", "ID", availabilityToCreate.ID); 

...에 : 다른 두 경우

internshipToCreate.contacts = contactToCreate; 
internshipToCreate.availability = availabilityToCreate; 

당신은 이미있는 객체의 ID를 할당하려고 시도 할 것으로 보인다.

internshipToCreate.classificationsReference.EntityKey = 
    new EntityKey("InternshipEntities.ClassificationSet", "ID", internshipToCreate.classifications.ID); 
internshipToCreate.educationReference.EntityKey = 
    new EntityKey("InternshipEntities.EducationSet", "ID", internshipToCreate.education.ID); 

그래서 당신은 단지 그들을 제거 할 수 있습니다이 두 라인은,이 날 것으로 보인다에도 성공하면, 아무것도하지 않는 것입니다.

두 가지 사항을 변경하면 어떻게됩니까?

+0

응답 해 주셔서 감사합니다. Craig. 엔티티를 만들 때 수동으로 키를 설정하지 않아도됩니다. 내가 게시 한 변경 사항을 적용하여받을 수 있습니다. 일반 : "항목을 업데이트하는 동안 오류가 발생했습니다.자세한 내용은의 InnerException를 참조하십시오 " 스택 추적을 보여줍니다 (다음 설명을 참조). –

+0

System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager에서 StateManager, IEntityAdapter 어댑터) 에서 System.Data.EntityClient.EntityAdapter에서 \ 프로젝트에서 Internship.Models.EntityInternshipRepository.CreateInternship에서 System.Data.Objects.ObjectContext.SaveChanges에서 System.Data.Objects.ObjectContext.SaveChanges (부울 acceptChangesDuringSave) () 에서 .update를 (IEntityStateManager entityCache) (인턴쉽 internshipToCreate) \ 인턴쉽 \ InternshipTest \ Models \ EntityInternshipRepository.cs : line 331 –

+0

InnerException은 무엇을 말합니까? –

3

안녕하세요,

나는 문제가 나는 제안이 무엇인지 모르겠지만. 메서드 (internshipToCreate)로 전달하는 인턴쉽 개체는 메서드 내부에서 인스턴스화 한 다른 엔터티 (Contact, Availability) 으로 값을 전송하는 데 사용되며 해당 생성은 제대로 작동합니다.

어쩌면 인턴쉽과 똑같이하려고해야할까요? 새 Internship 객체를 만들고 internshipToCreate 객체에서 가져온 모든 값을 설정하고 새로 생성 된 객체가 _internshipEntities.AddToInternshipSet 메서드에 전달하는 것보다 좋습니다.

다른 용도로 필요한 internshipToCreate 개체에 일부 값을 설정했을 수 있으며 그 중 일부는 실제로 예외를 발생시키는 것일 수 있습니다.

그리고 비즈니스 로직이 무엇인지 알 수는 없지만 처음 두 엔티티가 생성되고 세 번째 엔티티가 생성되지 않을 수 있으므로 모든 트랜잭션을 하나의 트랜잭션 아래에 넣는 것이 좋습니다.

+0

나는 이것을 지금 시험해 볼 것이다. 제안에 감사한다. –

+0

감사합니다. Misha, 나는 당신의 제안과 Craig를 모두 사용하여 작동하게했습니다. 건배! –

관련 문제