none
Como se puede almacenar una entidad heredada a partir de una existente RRS feed

  • Pregunta

  • Hola estoy aprendiendo a utilizar el entity framework y me he topado con un problema. Tengo una clase base que se llama "Persona" esta clase hereda a una que se llama "EmpleadoInterno" y otra que es "EmpleadoExterno"

    Cuando creo y almaceno entidades del tipo "EmpleadoInterno" o "EmpleadoExterno" se almacenan bien cada una con sus propiedades en cada tabla. Ya que estoy utilizando el modelo tabla por tipo(TPT).

    El problema ocurre cuando tengo personas creadas en la entidad base "Persona" y despues quiero agregar entidades de tipo "EmpleadoInterno" o "EmpleadoExterno" que ya existen.

    Ejemplo:

    Select * From dbo.Personas

    PersonId | Nombre | Apellido

    1            | Pedro    | Fernandez

    2            |Paco      | Stanley

    3            | Pablo    | Solis

    Select * From dbo.EmpleadosInternos

    PersonId | Nomina

    2            | 100

    Select * From dbo.EmpleadosExternos

    PersonId | NombreEmpresa

    3            | Consultor


    Cuando quiero crear una entidad de tipo Empleado Interno que tome como base la pesona con el Id = "1" es donde marca error.

    Adjunto todo el codigo para mayor información.

    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.ModelConfiguration;
    using System.Linq;
    using System.Web;

    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    namespace CE_Planning.samplemodels
    {
        public class NorthWindContext : DbContext
        {

            public NorthWindContext()
                : base("name=PlanningContext")
            {
                this.Configuration.LazyLoadingEnabled = false;
                this.Configuration.ProxyCreationEnabled = false;
            }

            public DbSet<Persona> Personas { get; set; }
            public DbSet<EmpleadoInterno> EmpleadosInternos { get; set; }
            public DbSet<EmpleadoExterno> EmpleadosExternos { get; set; }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Configurations.Add(new PersonaMap());

                modelBuilder.Configurations.Add(new EmpleadoInternoMap());

                modelBuilder.Configurations.Add(new EmpleadoExternoMap());

                base.OnModelCreating(modelBuilder);
            }

        }

        [Table("dbo.Personas")]
        public class Persona
        {
            [Key]
            [StringLength(10)]
            [Column("PersonaId")]
            public string PersonaId { get; set; }

            [Column("Nombre")]
            [StringLength(10)]
            public string Nombre { get; set; }

            [Column("Apellido")]
            [StringLength(20)]
            public string Apellido { get; set; }
        }

        [Table("dbo.EmpleadosInternos")]
        public class EmpleadoInterno : Persona
        {
            [Column("Nomina")]
            [StringLength(10)]
            public string Nomina { get; set; }
        }

        [Table("dbo.EmpleadosExternos")]
        public class EmpleadoExterno : Persona
        {
            [Column("NombreEmpresa")]
            [StringLength(10)]
            public string NombreEmpresa { get; set; }
        }

        public class PersonaMap : EntityTypeConfiguration<Persona>
        {
            public PersonaMap()
            {
                HasKey(x => x.PersonaId);
                Property(x => x.Nombre).HasMaxLength(20).IsRequired();
                Property(x => x.Apellido).HasMaxLength(10).IsRequired();
            }
        }

        public class EmpleadoInternoMap : EntityTypeConfiguration<EmpleadoInterno>
        {
            public EmpleadoInternoMap()
            {
                HasKey(x => x.PersonaId);
                ToTable("dbo.EmpleadosInternos");
            }
        }

        public class EmpleadoExternoMap : EntityTypeConfiguration<EmpleadoExterno>
        {
            public EmpleadoExternoMap()
            {
                HasKey(x => x.PersonaId);
                ToTable("dbo.EmpleadosExternos");
            }
        }
    }

    Asi es como utilizo las entidades.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    using SAP.Models;
    using System.Data.Entity;

    using CE_Planning.samplemodels;

    namespace CE_Planning
    {
        public partial class Sistemas : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                using (var db = new CE_Planning.samplemodels.NorthWindContext())
                {
                    Persona p = new Persona() {PersonaId="1", Nombre="Pedro", Apellido="Fernandez" };
                    EmpleadoInterno ei = new EmpleadoInterno() {PersonaId="2", Nombre = "Paco", Apellido="stanley", Nomina="100" };
                    EmpleadoExterno ee = new EmpleadoExterno() {PersonaId="3", Nombre = "Pablo", Apellido = "Solis", NombreEmpresa = "Consultor" };

                    db.Personas.Add(p);
                    db.EmpleadosInternos.Add(ei);
                    db.EmpleadosExternos.Add(ee);

                    db.SaveChanges();

                    EmpleadoInterno ei2 = new EmpleadoInterno() {PersonaId="1", Nombre="Pedro", Apellido="Fernandez", Nomina="200"};
                    db.EmpleadosInternos.Add(ei2);

                    db.SaveChanges();
                }
            }
        }
    }

    Muchas gracias de antemano.

    martes, 29 de julio de 2014 0:01