C# 实体框架“;包括「;不加载与实体相关的表
我有一个使用Visual Studio 2019(64位)和SQL Server 2019的ASP.NET Core 3.1项目。当我运行后端时,当我使用实体框架的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
.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; }
}