none
Relación uno a uno falta de referencia por los método WithOne y HasForeignKey RRS feed

  • Pregunta

  • Tengo un problema es mi primera base de datos con EFC. Estoy tratando de realizar una relación uno a uno, desde Tabla Clientes con Información de contacto del cliente, mediante Fluent API, pero en el método WithOne y HasForeignKey me dice que falta referencia no se que pueda ser.

    Error List

    Error CS1061 'EntityTypeBuilder' does not contain a definition for 'HasForeignKey' and no accessible extension method 'HasForeignKey' accepting a first argument of type 'EntityTypeBuilder' could be found (are you missing a using directive or an assembly reference?)

    Error CS1061 'EntityTypeBuilder' does not contain a definition for 'WithOne' and no accessible extension method 'WithOne' accepting a first argument of type 'EntityTypeBuilder' could be found (are you missing a using directive or an assembly reference?)

    algunas recomendaciones :)

    Mapeo de la base de datos

    using WebApplication.Repository;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Metadata.Builders;
    
    namespace WebApplication.Models
    {
        internal class ClienteEntityTypeConfiguration : IEntityTypeConfiguration<Cliente>
        {
            private const string TableName = "tbl_Cliente";
            public void Configure(EntityTypeBuilder<Cliente> builder)
            {
                builder.ToTable(TableName);
    
                builder.HasKey(cliente => cliente.Id); //Primary Key
                builder.HasAlternateKey(cliente => cliente.DNI); // Second Key
                // Relaciones
                builder.HasOne(cliente => cliente.InfoContacto);
                builder.WithOne(cliente => cliente.Cliente); 
                builder.HasForeignKey<InfoContacto>(info => info.ClienteID);
                // Propiedades
                builder.Property(cliente => cliente.DNI).IsRequired();
                builder.Property(cliente => cliente.Apellido).HasMaxLength(50);
                builder.Property(cliente => cliente.Nombre).HasMaxLength(50);
            }
        }
    
        internal class InfoContactoEntityTypeConfiguration : IEntityTypeConfiguration<InfoContacto>
        {
            private const string TableName = "tbl_InformacionContacto";
            public void Configure(EntityTypeBuilder<InfoContacto> builder)
            {
                builder.ToTable(TableName);
                builder.HasKey(info => info.InfoContactoID); // PK
                // Propiedades
                builder.Property(info => info.Telefono);
                builder.Property(info => info.Pais);
                builder.Property(info => info.Estado);
                builder.Property(info => info.Direccion);
            }
        }
    }
    Contexto y entidades
    using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore;
    using WebApplication.Models;
    using WebApplication.Repository;
    
    namespace WebApplication.Repository
    {
        public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
        {
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                : base(options){}
    
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.ApplyConfiguration(new ClienteEntityTypeConfiguration());
                modelBuilder.ApplyConfiguration(new InfoContactoEntityTypeConfiguration());
                base.OnModelCreating(modelBuilder);
            }
    
            public DbSet<Cliente> Clientes { get; set; }
            public DbSet<InfoContacto> InfoContacto { get; set; }
        }
    
        #region Dominion De Entidades
        public class Cliente
        {
            // PK - Primary Key
            public int Id { get; set; }
            public int DNI { get; set; }
            public string Nombre { get; set; }
            public string Apellido { get; set; }
            public InfoContacto InfoContacto { get; set; }
        }
        public class InfoContacto
        {
            // PK - Primary Key
            public int InfoContactoID { get; set; }
            public string Telefono { get; set; }
            public string Pais { get; set; }
            public string Estado { get; set; }
            public string Direccion { get; set; }
            // Fk - Foreign Key
            public int ClienteID { get; set; }
            // Propiedad De Navegacion
            public Cliente Cliente { get; set; }
        }
        #endregion
    }

    domingo, 2 de junio de 2019 16:15

Respuestas

  • Hola, al emplear FluentApi, debes aplicar el builder todas las opciones de seguido, esas opciones las tienes empleando ToTable() 

    using WebApplication.Repository;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Metadata.Builders;
    
    namespace WebApplication.Models
    {
        internal class ClienteEntityTypeConfiguration : IEntityTypeConfiguration<Cliente>
        {
            private const string TableName = "tbl_Cliente";
            public void Configure(EntityTypeBuilder<Cliente> builder)
            {
                builder.ToTable(TableName)
    
                       .HasKey(cliente => cliente.Id); //Primary Key
                       .HasAlternateKey(cliente => cliente.DNI); // Second Key
                // Relaciones
                       .HasOne(cliente => cliente.InfoContacto);
                       .WithOne(cliente => cliente.Cliente); 
                      .HasForeignKey<InfoContacto>(info => info.ClienteID);
                // Propiedades
                     .Property(cliente => cliente.DNI).IsRequired();
                     .Property(cliente => cliente.Apellido).HasMaxLength(50);
                    .Property(cliente => cliente.Nombre).HasMaxLength(50);
            }
        }
    
        internal class InfoContactoEntityTypeConfiguration : IEntityTypeConfiguration<InfoContacto>
        {
            private const string TableName = "tbl_InformacionContacto";
            public void Configure(EntityTypeBuilder<InfoContacto> builder)
            {
                builder.ToTable(TableName)
                       .HasKey(info => info.InfoContactoID); // PK
                // Propiedades
                       .Property(info => info.Telefono);
                       .Property(info => info.Pais);
                       .Property(info => info.Estado);
                       .Property(info => info.Direccion);
            }
        }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta I Love Sleep lunes, 3 de junio de 2019 16:35
    domingo, 2 de junio de 2019 22:46
    Moderador

Todas las respuestas

  • Hola, al emplear FluentApi, debes aplicar el builder todas las opciones de seguido, esas opciones las tienes empleando ToTable() 

    using WebApplication.Repository;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Metadata.Builders;
    
    namespace WebApplication.Models
    {
        internal class ClienteEntityTypeConfiguration : IEntityTypeConfiguration<Cliente>
        {
            private const string TableName = "tbl_Cliente";
            public void Configure(EntityTypeBuilder<Cliente> builder)
            {
                builder.ToTable(TableName)
    
                       .HasKey(cliente => cliente.Id); //Primary Key
                       .HasAlternateKey(cliente => cliente.DNI); // Second Key
                // Relaciones
                       .HasOne(cliente => cliente.InfoContacto);
                       .WithOne(cliente => cliente.Cliente); 
                      .HasForeignKey<InfoContacto>(info => info.ClienteID);
                // Propiedades
                     .Property(cliente => cliente.DNI).IsRequired();
                     .Property(cliente => cliente.Apellido).HasMaxLength(50);
                    .Property(cliente => cliente.Nombre).HasMaxLength(50);
            }
        }
    
        internal class InfoContactoEntityTypeConfiguration : IEntityTypeConfiguration<InfoContacto>
        {
            private const string TableName = "tbl_InformacionContacto";
            public void Configure(EntityTypeBuilder<InfoContacto> builder)
            {
                builder.ToTable(TableName)
                       .HasKey(info => info.InfoContactoID); // PK
                // Propiedades
                       .Property(info => info.Telefono);
                       .Property(info => info.Pais);
                       .Property(info => info.Estado);
                       .Property(info => info.Direccion);
            }
        }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta I Love Sleep lunes, 3 de junio de 2019 16:35
    domingo, 2 de junio de 2019 22:46
    Moderador
  • También Verifica que tienes referenciado el ensamblado Microsoft.EntityFrameworkCore.Relational

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    domingo, 2 de junio de 2019 22:56
    Moderador