EntityFramework: использование представления для расширения таблицы - PullRequest
1 голос
/ 06 мая 2020

Я хотел бы использовать представление для добавления информации в такую ​​таблицу

public class PocoTable
{
    public int Id { get; set; }
}

public partial class ImportStatingRecordError : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql(@"
CREATE VIEW PocoView
AS
    SELECT Id, ISNULL(l.InterestingValue, '?') AS InterestingValue
    FROM PocoTable t
        LEFT JOIN OtherTable o ON t.Id = o.PocoTableId
");
    }
}

public class PocoView : PocoTable
{
    public string InterestingValue { get; set; }
}

public class ApplicationDbContext : DbContext
{
    public DbSet<PocoTable> PocoTables { get; set; }
    public DbSet<PocoView> PocoViews { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<PocoView>().ToView("PocoView").HasKey(z => new z.Id);
    }
}

Но EntityFramework (ядро) не имеет его, потому что:

Тип объекта «PocoView» не может быть сопоставлен с таблицей, поскольку он является производным от «PocoTable». В таблицу можно сопоставить только базовые типы сущностей.

Можно ли заставить это работать? Или можно как-то иначе?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вы можете использовать метод HasBaseType (Type) и передать null, чтобы позволить EF Core не обрабатывать PocoTable как базовый объект (часть наследования базы данных ) из PocoView, например

modelBuilder.Entity<PocoView>()
    .HasBaseType((Type)null) // <--
    .ToView("PocoView");
0 голосов
/ 06 мая 2020

Это тоже работает:

public abstract class PocoBase 
{
  public int Id { get; set; }
}

[Table("PocoTable ")]
pubic class PocoTable : PocoBase {}

public class PocoView : PocoBase 
{
  public string InterestingValue { get; set; }
}

Что лучше?

...