使用MVP插入相关实体

时间:2012-03-16 21:54:18

标签: c# entity-framework mvp

我在我的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'模型中定义的插入方法吗?

4 个答案:

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

当您真正使用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属性,然后您可以构建一个新对象并插入它。

问候。