Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何首先在EntityFrameworkCore2.0代码中创建每类型表继承?_Entity Framework_.net Core_Entity Framework Core - Fatal编程技术网

Entity framework 如何首先在EntityFrameworkCore2.0代码中创建每类型表继承?

Entity framework 如何首先在EntityFrameworkCore2.0代码中创建每类型表继承?,entity-framework,.net-core,entity-framework-core,Entity Framework,.net Core,Entity Framework Core,下面的代码只生成一个表“CertificateEvent” 如何在EF Core 2.0中实现TPT继承? public abstract class CertificateEvent { public int CertificateEventId { get; set; } } public class Assignment : CertificateEvent {...} public class Assessment : CertificateEvent {...} public

下面的代码只生成一个表“CertificateEvent”

如何在EF Core 2.0中实现TPT继承?

public abstract class CertificateEvent {
   public int CertificateEventId { get; set; }
}

public class Assignment : CertificateEvent {...}
public class Assessment : CertificateEvent {...}

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

    }

    public DbSet<Assessment> AssessorAssessments { get; set; }
    public DbSet<Assignment> AssessorAssignments { get; set; }

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

        modelBuilder.Entity<CertificateEvent>().ToTable(nameof(CertificateEvent));
        modelBuilder.Entity<Assessment>().ToTable(nameof(Assessment));
        modelBuilder.Entity<Assignment>().ToTable(nameof(Assignment));
    }
}

class MyDesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
{
    public MyDbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<MyDbContext>();
        builder.UseSqlServer("Server=(local);Database=Test;Trusted_Connection=True;MultipleActiveResultSets=true");
        return new MyDbContext(builder.Options);
    }
}
公共抽象类CertificateEvent{
public int CertificateEventId{get;set;}
}
公共类赋值:CertificateEvent{…}
公开课评估:CertificateEvent{…}
公共类MyDbContext:DbContext
{
公共MyDbContext(DbContextOptions):基本(选项)
{
}
公共DbSet assessments{get;set;}
公共DbSet AssessorAssignments{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().ToTable(nameof(CertificateEvent));
modelBuilder.Entity().ToTable(nameof(Assessment));
modelBuilder.Entity().ToTable(nameof(Assignment));
}
}
类MyDesignTimeDbContextFactory:IDesignTimeDbContextFactory
{
公共MyDbContext CreateDbContext(字符串[]args)
{
var builder=new DbContextOptionsBuilder();
UseSqlServer(“服务器=(本地);数据库=测试;可信连接=真;MultipleActiveResultSets=真”);
返回新的MyDbContext(builder.Options);
}
}
我还尝试了
dotnet ef migrations add heritation
,但它没有在数据库中创建TPT继承

TPT不在ef核心中(尚未)。看

我们团队的感觉是TPT通常是一种反模式和 导致以后出现重大性能问题。在启用它的同时 可能会让一些人从一开始就“更快乐”,最终只是导火索 解决问题。我们愿意考虑一下,所以我们要离开这里。 打开,并将根据我们得到的反馈来考虑。


如果CertificateEvent是具体类,是否可以编写TPC?否。目前仅支持TPH,对于代码优先的场景,也建议使用TPH。TPH是第一个实现的,因为它是大多数新应用程序的最佳策略。我唯一的问题是继承的类太多,我不希望最终的表有100列。我需要选择所有CertificateEvents,因此不可能使用没有关系的单独表。@DavidBrowne Microsoft我们的团队正在将WPF应用程序转换为asp.net core mvc。WPF应用程序使用TPT。为了快速完成任务,我们使用生成实体类时提供的组合。我刚刚更新了实体类以反映遗留问题。我将尝试通过新的实体类生成一个新的db模式,从而为我们提供一个TPH结构。这个我目前正在研究(在我的头脑中)在这种情况下,组合相对于继承的优势是什么,反之亦然。我以后可能会想出来,但我把它忘了?如果我理解您的意思,您正在创建一个EF核心模型,该模型映射到EF6 TPT中使用的现有表。这将导致使用组合而不是继承的模型。您将失去继承模型提供的一些编码便利。例如Customer.Person.Name而不是Customer.Name等。