Вставьте связанные объекты, используя MVP - PullRequest
4 голосов
/ 17 марта 2012

Я использую шаблон MVP и EF в моем приложении C #. В моей структуре базы данных есть отношение один-ко-многим между «персонажами» и «referencias», у каждого «персонажа» может быть 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 ]

2 голосов
/ 26 марта 2012

Вы можете добавить их в свойство навигации 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();
    }
1 голос
/ 27 марта 2012

Вот код, затем я объясню:)

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 Скотта Гу, которая может оказаться полезной для вас.

0 голосов
/ 25 марта 2012

если я вас понимаю ...

В представлении (IViewPersona) вы можете использовать свойство Referencia, затем вы можете построить новый объект и вставить его.

С уважением.

0 голосов
/ 20 марта 2012

Отказ от ответственности: я не знаком с 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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...