简体   繁体   中英

No method to map entity to table in entity framework core

I am using entity framework core in a normal .net project, version 4.7. I know I can do this. The problem is that I can't seem to map an entity to a table because the "ToTable" method doesn't exist. I can't edit the poco or entity classes because they are predefined and generated. So I can't use the attribute. I looked on the inte.net and everyone seems to use this method to map an entity to a table.

Here is my code:

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");
    }
}

I also tried to use IEntityTypeConfiguration with a EntityTypeBuilder but it still don't have access to the map to table method:

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

I looked into the Entity Framework Core repository on GitHub and searched for the method "Totable" inside the repository. It turns out it is defined as an extension method but it is in separate nuget package and library called Microsoft.EntityFrameworkCore.SqlServer

After I downloaded the package I got the Totable method that I need. Still it doesn't make sense to add that method in a separate package for sql server when you already have the "Table" attribute that you can add on entities directly in the entity framework core package.

You can use the below approach. You have to use Table data annotation.

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
    }

Model class:

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

You can also use to ToTable in DBContext, but you have to make sure that you have included using Microsoft.EntityFrameworkCore; .

Line modelBuilder.Entity<TblIncident>().ToTable("Incident"); looks correct according to the documentation. https://docs.microsoft.com/en-us/ef/core/modeling/relational/tables#fluent-api

It's very old thread but I got the same issue and I solved it by placing base.OnModelCreating(builder) as a first line of OnModelCreating method.

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

    // Rest of the code
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM