无法在Entity Framework Core中将实体映射到表的方法

5
我正在一个普通的.NET项目中使用Entity Framework Core,版本为4.7。我知道我可以做到这一点,但问题是我似乎无法映射实体到表格,因为"ToTable"方法不存在。我无法编辑POCO或实体类,因为它们是预定义和生成的。所以我不能使用属性。我在互联网上搜索了一下,每个人似乎都使用这种方法将实体映射到表格。
以下是我的代码:
public class FactsDbContext : DbContext
{
    public DbSet<TblIncident> TblIncidents { get; set; }

    public DbSet<TblAction> TblActions { get; set; }

    public DbSet<TblAddressTypeAlias> TblAddressTypeAliases { get; set; }

    public DbSet<TblCountry> TblCountries { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //these methods don't exist in my case
        modelBuilder.Entity<TblIncident>(entity => entity.ToTable("Incident"));
        modelBuilder.Entity<TblIncident>().ToTable("Incident");
    }
}

我也尝试使用IEntityTypeConfiguration和EntityTypeBuilder,但仍然无法访问映射到表方法:

public class IncidentConfig : IEntityTypeConfiguration<TblIncident>
{
    public void Configure(EntityTypeBuilder<TblIncident> builder)
    {
        builder.ToTable("Incident");
    }
}

这些方法被移除的原因是什么?我一直在搜索。 - Donald N. Mafa
3个回答

10
我在GitHub上查看了Entity Framework Core的存储库,搜寻了名为“Totable”的方法。结果发现它是一个扩展方法,但在单独的nuget包和库Microsoft.EntityFrameworkCore.SqlServer中定义。
我下载了这个包后,获得了所需的Totable方法。然而,在Entity Framework Core包中已经有可以直接添加到实体上的“Table”属性时,将该方法添加到一个专门针对sql server的单独包中并没有什么意义。

不,你没有提到下载 SQL Server NuGet 包以获取 Entity Framework Core,其中包括我所需的 Totable 方法。Totable 方法未包含在 Microsoft.EntityFrameworkCore 命名空间中。至少在我的版本中是这样的。可能有多个版本,每个版本都有其独特的问题。 - Alecu
我的问题是关于Totable方法,而不是关于如何将实体映射到表的方式。标题和描述中都提到了这个方法,而不是属性“Table”。 - Alecu
是的,我给了你一个替代方案,可以百分之百地解决你的问题。如果有任何限制,请在问题中提到。 - Vivek Nuna
是的,但在问题中我没有提到我正在寻找替代方法。我问的是Totable方法没有找到,我应该在哪里找到它。 - Alecu
我从未要求过任何投票。如果我根据问题描述回答了你的问题,那么你至少应该表示感激。同时,重要的是要知道,如果你在问题中没有任何限制,那么解决这个问题有一种非常简单的方法。 - Vivek Nuna
显示剩余2条评论

2
你可以采用以下方法,需要使用Table数据注释。 DBContext:
public virtual DbSet<Article> Article { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Article>(b =>
    {
        b.Property(e => e.Property1).HasDefaultValue(true);
        ... //Other properties
    }

模型类:

[Table("Article")]
public class Article
{

您还可以在DBContext中使用 ToTable 方法,但需要确保已经包含了 using Microsoft.EntityFrameworkCore;

根据文档,modelBuilder.Entity<TblIncident>().ToTable("Incident"); 这一行看起来是正确的。

https://learn.microsoft.com/en-us/ef/core/modeling/relational/tables#fluent-api

问题是Poco类是从另一个源生成的,我无法真正编辑它们。 - Alecu
你的DbContext类中是否缺少使用Microsoft.EntityFrameworkCore? - Vivek Nuna
1
ToTable 定义在 Microsoft.EntityFrameworkCore.Relational 程序集中。 - VahidN

-4

这是一个很老的线程,但我遇到了同样的问题,并通过将base.OnModelCreating(builder)放置在OnModelCreating方法的第一行来解决它。

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    // Rest of the code
}

1
这并不能神奇地使 ToTable 方法生效。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接