2012-03-16 48 views
4

我在我的C#应用​​程序中使用MVP模式和EF。在我的数据库设计中,'personas'和'referencias'之间有一对多的关系,每个'personas'可以有0或多个'referencias'。使用MVP插入相关实体

根据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

它看起来像典型的对象映射。 automapper可以为你做。 http://stackoverflow.com/questions/286294/object-to-object-mapper – 2012-03-27 13:45:34

回答

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时,所有这些工作都是在两个对象(PersonaReferencia)之间建立一个链接(关系)。对象仍然是独立的,只能通过这个集合链接。

当你去实际创建PersonaReferencia映射,你必须创建你的Persona,然后创建了Referencia的单独的对象涉及它的Persona将其添加到Persona的ICollection的映射( 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;} 
} 

请注意,属性名称与类名称相同。这是一个惯例,如果您通过命名属性来改变其他属性,那么您需要在PersonaReferencias对象上添加一个属性。这是因为EF知道这是双向关系。所以,如果你决定在ReferenciaPersonaRef命名Persona财产,那么你的代码看起来更象这样:

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

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 

希望有所帮助。

0

如果我理解你...

在视图(IViewPersona)可以使用Referencia属性,那么你可以建立一个新的对象,并插入此。

问候。

+0

我明白了,但'Referencia'模型在哪里?我想我需要一个模型来处理所有'Referencia'数据,不是吗? – 2012-03-26 21:06:23

2

您可以将它们添加到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 ref1 = new Referencia(); 
      //populate related properties. 
      per.Referencias.Add(ref1); 
      context.personas.AddObject(per); 
      context.SaveChanges(); 
    } 
+0

我明白你的观点,但是如果我在'Personas'模型中填充'Referencia'属性,那么为'Referencia'制作模型有什么用处?我想我需要一个模型,只需要某种实用性 – 2012-03-26 21:03:04

+0

@JorgeZapata实际上,您只需添加Referencia即可添加Referencia对象。另一方面,如果你想链接一个人物角色和一个参考国,你必须有选择权,或者在参议院设置角色的外键;或向女神角色添加Referencia对象。两者都不是错的,但大多我更喜欢第二种方式。 EF不会为关系生成实体(除非例如您有一个n到n的关系并明确标记为这样做),它会生成实体;使用实体你可以管理实体之间的关系。 – daryal 2012-03-27 05:46:32