我在我的C#应用程序中使用MVP模式和EF。在我的数据库设计中,'personas'和'referencias'之间存在一对多的关系,每个'personas'可以有0或多个'referencias'。
根据MVP模式,我有一个'Personas'模型,它在我的物理数据库中执行CRUD操作。我有一个执行插入的方法:
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
};
context.personas.AddObject(per);
context.SaveChanges();
}
问题是:如何在我的代码中关联'referencias'插入?按照MVP规则,我必须为'referencias'创建一个模型,不是吗?我应该调用'referencias'模型中定义的插入方法吗?
答案 0 :(得分:2)
您可以将它们添加到Referencia导航属性中。这样它们也会插入db。
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 ref1 = new Referencia();
//populate related properties.
per.Referencias.Add(ref1);
context.personas.AddObject(per);
context.SaveChanges();
}
答案 1 :(得分:1)
这是代码,然后我将解释:)
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)。因此,您将获得所需的两个不同模型,并且可以使用关系映射属性在两者之间进行遍历。
Here is a very good article on EF Code First by Scott Gu that you might find helpful
答案 2 :(得分:0)
免责声明:我不熟悉EF和MVP,只有ORM。
您很可能必须实例化Referencia
课程的新实例,可能会将其添加到Persona
课程的收藏中。
在我的ActiveRecord / NHibernate堆栈中,我就是这样的:
Persona per = new Persona(...); // as you do now
per.Referencias = new List<Referencia>();
per.Referencias.Add(new Referencia(...)); // same way you create Personas
希望有所帮助。
答案 3 :(得分:0)
如果我理解你......
在视图(IViewPersona)中,您可以使用Referencia属性,然后您可以构建一个新对象并插入它。
问候。