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.