Вот код, затем я объясню:)
public class Persona
{
public Persona()
{
//Make sure that Referencias is instantiated by default
Referencias = new List<Referencia>();
}
public String Nombres {get; set;}
//...The other properties of Persona
public Int publicIDEmpresa {get; set;}
//The virtual is here for lazy loading
public virtual ICollection<Referencia> Referencias {get; set;}
}
public class Referencia
{
public Int ReferenciaId {get; set;}
public String Nombre {get; set;}
//...Other properties of Referencia
}
Ваш код для совместной работы:
public void AgregaPersona(_Persona persona)
{
Persona per = new Persona()
{
Nombres = persona.nombres,
ApellidoP = persona.apellidoP,
ApellidoM = persona.apellidoM,
FechaNacimiento = persona.fechaNacimiento,
Sexo = persona.sexo.ToString(),
EdoCivil = persona.edoCivil,
RFC = persona.RFC,
CURP = persona.CURP,
Domicilio = persona.domicilio,
CP = persona.codigoPostal,
Telefonos = persona.telefonos,
Celular = persona.celular,
Email = persona.email,
IDDel = persona.idDelegacion,
IDEmpresa = persona.idEmpresa
};
Referencia newRef = new Referencia
{
Nombre = referenciaNombre;
//Fill the rest of the properties except ID (this should be auto)
}
per.Referencias.Add(newRef);
context.personas.AddObject(per);
context.SaveChanges();
}
Это все, что вам нужно сделать, еслисоздание двух отдельных объектов (как вы ожидали), которые связаны друг с другом.Вот мое лучшее описание того, что здесь происходит
Когда вы создаете ICollection<Referencia> Referencias
, все, что он делает, это создает связь (связь) между двумя объектами (Persona
и Referencia
).Объекты все еще разделены, только связаны через эту коллекцию.
Когда вы на самом деле создаете Persona
с Referencia
отображениями, вы должны создать свой Persona
, затем вы создаете отдельный объект Referencia
и относительный это к Persona
, добавляя его к отображению ICollection Persona
(Referencias
).Когда фактический код запускается для сохранения этого в базе данных, он будет обрабатывать это как отдельные вставки, что-то вроде этого псевдокода:
BEGIN TRANSACTION
INSERT PERSONA
GET PERSONA ID
INSERT REFERENCIA USING NEW PERSONA ID(Repeat until all Referencias are inserted)
COMMIT TRANSACTION
Теперь, имейте в виду примечание, которое я сделал о отложенной загрузке.По умолчанию всякий раз, когда вы загружаете Persona
, он не будет загружать Referencias
, пока он вам действительно не понадобится.Эти объекты будут загружены только из базы данных, если вы попытаетесь получить доступ к значениям в этом свойстве.Таким образом, еще более подчеркивая, что это действительно два отдельных объекта.
Кроме того, вы можете создать двустороннее отображение, если хотите.Вы просто добавляете другую ссылку (отношение), на этот раз от Referencia
к соответствующей Persona
.
public class Referencia
{
public Int ReferenciaId {get; set;}
public String Nombre {get; set;}
//....Other properties of Referencia
public virtual Persona Persona {get;set;}
}
Обратите внимание, что имя свойства совпадает с именем класса.Это соглашение, и если вы уклоняетесь, присваивая свойству другое имя, вам нужно будет добавить атрибут над объектом Referencias
в Persona
.Это так, что EF знает, что это двусторонние отношения.Итак, если вы решите назвать свойство Persona
в Referencia
как-то как PersonaRef
, то ваш код будет выглядеть примерно так:
public class Persona
{
public Persona()
{
//Make sure that Referencias is instantiated by default
Referencias = new List<Referencia>();
}
public String Nombres {get; set;}
//...The other properties of Persona
public Int publicIDEmpresa {get; set;}
//The virtual is here for lazy loading
[InverseProperty("PersonaRef")]
public virtual ICollection<Referencia> Referencias {get; set;}
}
Надеюсь, это даст вам лучшее понимание того, какотношения работают в EF (и это довольно хорошо транслируется в другие ORM).Итак, вы получаете две разные модели, которые вам нужны, и можете переходить между ними со свойствами сопоставления отношений.
Вот очень хорошая статья о EF Code First Скотта Гу, которая может оказаться полезной для вас.