首页 > 解决方案 > 实体大小对 EF Core 中的性能是否重要,首先使用 DB?

问题描述

我正在编写一个 ASP.NET Core Web API 项目。作为数据源它将使用现有的(并且相当大的)数据库。但不是整个数据库。API 将仅使用一些表,即使在这些表中它也不会使用所有列。

使用逆向工程和脚手架,我能够生成DbContext实体类......这让我开始思考。有一个包含 30 列(或更多)的表。我正在使用这张表,但我只需要 5 列。

我的问题是: 从 C# 实体对象中删除 25 个未使用的列有什么好处吗?真的有关系吗?

将它们留在那里未使用的好处是,如果有人想要添加需要其中一个的新功能,他不需要去数据库和逆向工程所需的列(已经有)。

删除未使用的好处是......?

编辑:这是示例代码:

public class FooContext : DbContext
{
    public FooContext(DbContextOptions<FooContext> options)
        : base(options)
    {
    }

    public DbSet<Item> Items { get; set; }
}

[Table("item")]
public class Item
{
    [Key]
    [Column("itemID", TypeName = "int")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Column("name", TypeName = "varchar(255)")]
    public string Name { get; set; }
}    

示例用法:

public ItemDto GetItem(int id)
{
    var item = _fooContext.Items.Where(i => i.Id == id).FirstOrDefault();

    // Here I have item with two fields: Id and Name. 

    var itemDto = _mapper.Map<ItemDto>(item);
    return itemDto;
}

显然我对更复杂的操作很好奇。像...当项目实体被其他实体包含时。例如:

_foo.Warehouse.Include(i => i.Items)

Item或实体上的其他更复杂的功能

标签: c#entity-framework.net-coreentity-framework-coreasp.net-core-webapi

解决方案


您的实体需要匹配数据库中的内容,即您需要一个属性来匹配每一列(忽略任何影子属性)。这里别无选择,否则 EF 会抱怨。

但是,当您实际查询时,您可以通过以下方式仅选择您实际需要的列:

var foos = await _context.Foos
    .Select(x => new
    { 
       Bar = x.Bar,
       Baz = z.Baz
    })
    .ToListAsync();

或者,如果您不需要能够插入/更新表,您可以选择使用DbQuery<T>而不是DbSet<T>. 使用DbQuery<T>,您可以使用任何您想要的类,并通过FromSql.


推荐阅读