代码之家  ›  专栏  ›  技术社区  ›  Graham Conzett

EntityReference的EntityKey属性值不匹配?

  •  1
  • Graham Conzett  · 技术社区  · 15 年前

    我正在尝试添加我创建的一些实体。当我尝试将有问题的实体添加到集合中(请参见下面的代码)时,会出现以下错误:

    “无法添加或附加对象,因为其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;
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  3
  •   Misha N.    15 年前

    你好,

    虽然我不确定问题出在哪里,但我有一个建议。您要传递到方法(InternoshipToCreate)中的实习对象用于将值传递到其他实体(联系人、可用性) 您在方法内部实例化的

    也许你应该试着在实习中也这样做?创建新的实习对象并设置所有值,方法是将这些值从“实习”传递到“创建对象”,然后将新创建的对象传递到_internishipEntities.AddToInternshipSet方法。

    有可能您已经在InternistHipToCreate对象上设置了一些用于其他目的的值,其中一些值实际上导致了异常。

        2
  •  2
  •   Craig Stuntz    15 年前

    这个代码对我来说没什么意义。在两种情况下,当您可以只指定一个对象引用时,您正在经历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;
    

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

    当您进行这两个更改时会发生什么?

    推荐文章