Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架“;包括「;不加载与实体相关的表_C#_Entity Framework Core_Ef Core 3.1 - Fatal编程技术网

C# 实体框架“;包括「;不加载与实体相关的表

C# 实体框架“;包括「;不加载与实体相关的表,c#,entity-framework-core,ef-core-3.1,C#,Entity Framework Core,Ef Core 3.1,我有一个使用Visual Studio 2019(64位)和SQL Server 2019的ASP.NET Core 3.1项目。当我运行后端时,当我使用实体框架的.Include从相关表加载数据时,它会生成一个错误。奇怪的是,在Visual Studio 2017中使用ASP.NET Core 2.1时,相同的代码工作时没有问题。这在我使用.Include从相关表加载数据的每个方法中都会发生 下图显示了运行后端时生成的错误: 这是我使用。Include的方法: namespace Siste

我有一个使用Visual Studio 2019(64位)和SQL Server 2019的ASP.NET Core 3.1项目。当我运行后端时,当我使用实体框架的
.Include
从相关表加载数据时,它会生成一个错误。奇怪的是,在Visual Studio 2017中使用ASP.NET Core 2.1时,相同的代码工作时没有问题。这在我使用
.Include
从相关表加载数据的每个方法中都会发生

下图显示了运行后端时生成的错误:

这是我使用
。Include
的方法:

namespace Sistema.Web.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ArticulosController : ControllerBase
    {
        private readonly DbContextSistema _context;

        public object Articulos { get; private set; }

        public ArticulosController(DbContextSistema context)
        {
            _context = context;
        }

        [HttpGet("[action]")]
        public async Task<IEnumerable<ArticuloViewModel>> Listar()
        {
            var articulo = await _context.Articulos.Include(a=>a.categoria).ToListAsync();
            return articulo.Select(a => new ArticuloViewModel
            {
                idarticulo = a.idarticulo,
                idcategoria = a.idcategoria,
                categoria = a.categoria.nombre,
                codigo = a.codigo,
                nombre = a.nombre,
                stock = a.stock,
                precio_venta = a.precio_venta,
                descripcion = a.descripcion,
                condicion = a.condicion
            });
        }

        private bool ArticuloExists(int id)
        {
            return _context.Articulos.Any(e => e.idarticulo == id);
        }
    }
}
这是相关表(类别A)的实体:

这是
Categoria
的映射类:

namespace Sistema.Datos.Mapping.Almacen
{
    public class CategoriaMap : IEntityTypeConfiguration<Categoria>
    {
        public void Configure(EntityTypeBuilder<Categoria> builder)
        {
            builder.ToTable("categoria")
                .HasKey(c => c.idcategoria);
            builder.Property(c => c.nombre)
                .HasMaxLength(50);
            builder.Property(c => c.descripcion)
                .HasMaxLength(256);
        }
    }
}
以下是
articulo
categoria
的数据库表设计以及所需的数据库关系:

在.NETCore3.1中有什么变化吗?是否有需要更改或调整的内容来解决此问题?非常感谢您的回复

编辑:

  • 替换源代码的图像
  • 添加了相关表的实体的源代码
    Categoria
  • 添加了映射类的源代码
    CategoriaMap
  • 添加了db表设计和关系的图像

我提前向您道歉,因为我只使用了图片而没有使用源代码。感谢您的回复,我希望最后一次编辑能够让问题的解决变得更加清晰。

有几种方法可以告诉英孚如何建立关系。默认情况下,对于对象:

//principal
public class Categoria
{
    public int idcategoria { get; set; }

    ...

    public ICollection<Articulo> articulos { get; set; }
}

//dependent
public class Articulo
{
    public int idarticulo { get; set; }
    public int idcategoria { get; set; }

    ...

    public Categoria categoria { get; set; }
}

我想只要选择你更喜欢的,并保持一致。使用中的示例取决于

请将代码作为文本,而不是屏幕截图。并使用预览功能检查格式是否正确。考虑到截图和添加问题比粘贴代码更难,我一直想知道人们为什么要走这种艰难的道路..TLDR;在我们帮助您之前,您需要向我们展示您的db表设计和关系啊,我忘记了这个脚注:注意:在EF Core 3.0之前,名为与主键完全相同的属性也与外键匹配最简单,我想您需要使用
[ForeignKey(“idcategoria”)]
articulos
categoria
属性进行注释,让EF知道articulo.idcategoria是链接articulo和categoriaIt的一列,可以完美地工作!我不知道EF在3.0之后改变了表关系的约定,现在我更好地理解了如何在相关表中指定外键,也感谢链接文档,这非常有帮助。非常感谢你!
namespace Sistema.Datos.Mapping.Almacen
{
    public class ArticuloMap : IEntityTypeConfiguration<Articulo>
    {
        public void Configure(EntityTypeBuilder<Articulo> builder)
        {
            builder.ToTable("articulo")
                .HasKey(a => a.idarticulo);     
        }
    }
}
namespace Sistema.Datos.Mapping.Almacen
{
    public class CategoriaMap : IEntityTypeConfiguration<Categoria>
    {
        public void Configure(EntityTypeBuilder<Categoria> builder)
        {
            builder.ToTable("categoria")
                .HasKey(c => c.idcategoria);
            builder.Property(c => c.nombre)
                .HasMaxLength(50);
            builder.Property(c => c.descripcion)
                .HasMaxLength(256);
        }
    }
}
namespace Sistema.Datos
{
    public class DbContextSistema : DbContext
    {
        public DbSet<Categoria> Categorias { get; set; }
        public DbSet<Articulo> Articulos { get; set; }
        public DbSet<Rol> Roles { get; set; }
        public DbSet<Usuario> Usuarios { get; set; }
        public DbSet<Persona> Personas { get; set; }
        public DbSet<Ingreso> Ingresos { get; set; }

        public object Entry(object articulos)
        {
            throw new NotImplementedException();
        }

        public DbSet<DetalleIngreso> DetalleIngresos { get; set; }
        public DbSet<Venta> Ventas { get; set; }
        public DbSet<DetalleVenta> DetalleVentas { get; set; }

        public DbContextSistema(DbContextOptions<DbContextSistema> options) : base(options)
        {

        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            
            modelBuilder.ApplyConfiguration(new CategoriaMap());
            modelBuilder.ApplyConfiguration(new ArticuloMap());
            modelBuilder.ApplyConfiguration(new RolMap());
            modelBuilder.ApplyConfiguration(new UsuarioMap());
            modelBuilder.ApplyConfiguration(new PersonaMap());
            modelBuilder.ApplyConfiguration(new IngresoMap());
            modelBuilder.ApplyConfiguration(new DetalleIngresoMap());
            modelBuilder.ApplyConfiguration(new VentaMap());
            modelBuilder.ApplyConfiguration(new DetalleVentaMap());
        }
    }
}
//principal
public class Categoria
{
    public int idcategoria { get; set; }

    ...

    public ICollection<Articulo> articulos { get; set; }
}

//dependent
public class Articulo
{
    public int idarticulo { get; set; }
    public int idcategoria { get; set; }

    ...

    public Categoria categoria { get; set; }
}
//principal
public class Categoria
{
    public int idcategoria { get; set; }

    ...

    [ForeignKey("idcategoria")] //it means Articulo.idcategoria is the relevant property that links to PK of this class
    public ICollection<Articulo> articulos { get; set; }
}
//dependent
public class Articulo
{
    public int idarticulo { get; set; }
    public int idcategoria { get; set; }

    ...

    [ForeignKey("idcategoria")] //it means idcategoria proerty above is the relevant property that links to PK property of Categoria
    public Categoria categoria { get; set; }
}