【问题标题】:EntityFramwork Core and Inheritance TPTEntityFramwork 核心和继承 TPT
【发布时间】:2020-10-15 16:41:29
【问题描述】:

我读过一些帖子,比如thisthisthis

数据库中的一些表:

我从使用 Scaffold-DbContext 创建模型的 EF4 迁移而来,我预计它会生成以下内容:

class Tagesinkassos {}
class TagesinkassosPOSTagesinkasso : Tagesinkassos {}
class TagesinkassosTagesinkasso : Tagesinkassos {}

我得到了:

class TagesinkassosPOSTagesinkasso {}
class TagesinkassosTagesinkasso {}
class Tagesinkassos {
    public virtual TagesinkassosPOSTagesinkasso TagesinkassosPOSTagesinkasso { get; set; }
    public virtual TagesinkassosTagesinkasso TagesinkassosTagesinkasso { get; set; }
}

我读到 EFCore 还不支持 TPC,但这是 TPT,对吧?

但是,如果我修改生成的模型,我会得到:

System.InvalidOperationException: 'The entity type 'TagesinkassosTagesinkasso' cannot be mapped to a table because it is derived from 'Tagesinkassos'. Only base entity types can be mapped to a table.'

是否可以修改模型或者数据库中是否存在强制这种模式的东西?

【问题讨论】:

    标签: c# inheritance entity-framework-core


    【解决方案1】:

    Table-per-Type 在低于 5.0 的 EF Core 版本中不受支持。它最初是在EF Core 5 Preview 8 中添加的。如果要使用 TPT,则必须迁移到 EF Core 5。

    目前 EF Core 5 处于 RC2 中,可用于生产。来自announcement

    这是 EF Core 5.0 的功能完整候选版本,并附带“上线”许可证。支持您在生产中使用它。

    从文档的示例中,这些类:

    [Table("Animals")]
    public class Animal
    {
        public int Id { get; set; }
        public string Species { get; set; }
    }
    
    [Table("Pets")]
    public class Pet : Animal
    {
        public string Name { get; set; }
    }
    
    [Table("Cats")]
    public class Cat : Pet
    {
        public string EdcuationLevel { get; set; }
    }
    
    [Table("Dogs")]
    public class Dog : Pet
    {
        public string FavoriteToy { get; set; }
    }
    

    将映射到这些表:

    CREATE TABLE [Animals] (
        [Id] int NOT NULL IDENTITY,
        [Species] nvarchar(max) NULL,
        CONSTRAINT [PK_Animals] PRIMARY KEY ([Id])
    );
    
    CREATE TABLE [Pets] (
        [Id] int NOT NULL,
        [Name] nvarchar(max) NULL,
        CONSTRAINT [PK_Pets] PRIMARY KEY ([Id]),
        CONSTRAINT [FK_Pets_Animals_Id] FOREIGN KEY ([Id]) 
                   REFERENCES [Animals] ([Id]) ON DELETE NO ACTION
    );
    
    CREATE TABLE [Cats] (
        [Id] int NOT NULL,
        [EdcuationLevel] nvarchar(max) NULL,
        CONSTRAINT [PK_Cats] PRIMARY KEY ([Id]),
        CONSTRAINT [FK_Cats_Animals_Id] FOREIGN KEY ([Id]) 
                   REFERENCES [Animals] ([Id]) 
                   ON DELETE NO ACTION,
        CONSTRAINT [FK_Cats_Pets_Id] FOREIGN KEY ([Id]) 
                   REFERENCES [Pets] ([Id]) 
                   ON DELETE NO ACTION
    );
    
    CREATE TABLE [Dogs] (
        [Id] int NOT NULL,
        [FavoriteToy] nvarchar(max) NULL,
        CONSTRAINT [PK_Dogs] PRIMARY KEY ([Id]),
        CONSTRAINT [FK_Dogs_Animals_Id] FOREIGN KEY ([Id]) 
                   REFERENCES [Animals] ([Id]) 
                   ON DELETE NO ACTION,
        CONSTRAINT [FK_Dogs_Pets_Id] FOREIGN KEY ([Id]) 
                   REFERENCES [Pets] ([Id]) 
                   ON DELETE NO ACTION
    );
    

    【讨论】:

    • 非常感谢,我误会了。
    • 我迁移到 EFCore 5 rc,有一个问题:github.com/dotnet/efcore/issues/23011
    • 他们会要求您提供更多信息。最可能的原因是没有这样的属性。您调用的函数指的是 properties,而不是列。属性名称区分大小写
    • @Emaborsa 你应该使用accepts expression 的重载来避免拼写错误和大小写问题
    • 我同意你的观点,但它是由脚手架工具生成的代码。
    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多