EF Core .NET CLI 是否支持脚手架的继承?
Does EF Core .NET CLI support inheritance for scaffolding?
采取以下类:
public class Person
{
public int ID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
}
public class Instructor : Person
{
public DateTime HireDate { get; set; }
}
public class Student : Person
{
public DateTime EnrollmentDate { get; set; }
}
然后“dotnet ef database update”将创建一个名为 Person 的单个 table,其中包含一个 Discriminator 列(table-per-hierarchy 继承)。
CREATE TABLE [dbo].[Person](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Discriminator] [nvarchar](max) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[HireDate] [datetime2](7) NULL,
[EnrollmentDate] [datetime2](7) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
问题:是否可以使用“dotnet ef dbcontext scaffold”从 Person 数据库 table 重新创建三个 类?
谢谢
我不会大胆的说'NO'。相反,我只是说到目前为止我一直是手动完成的,因为我个人还没有遇到任何为自动脚手架指定此方法的方法,我无法想象这样的工具如何工作。
第一个问题是鉴别器列可以是任意列。虽然这可以通过简单地使用命令行开关指定鉴别器的名称然后为每个不同的值生成一个 class 来解决,但还有一个更大的问题:无法分辨哪个列属于哪个 class. scaffolder 唯一可以做的就是将所有不可为 null 的内容放入基 class。但是可为空的列呢?它们是否可以为空,因为它们是基础 class 的一部分并且被指定为可以为空(明确地或按照惯例),或者它们是否可以为空,因为它们在后代 class 之一中?如果他们在后代 classes 中,在哪一个?没有办法告诉为什么列为空;是因为它在另一个 class 中,还是因为它在代表该对象的记录中此刻没有值?
但是,公平地说,重新设计脚手架代码并没有那么多工作。
- 搭建模型
- 创建后代classes
- 只需将基础 class 的属性剪切并粘贴到后代
- 删除鉴别器属性
- 设置继承以使用鉴别器并使用匹配值(EF Core 参见此处:https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance)
采取以下类:
public class Person
{
public int ID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
}
public class Instructor : Person
{
public DateTime HireDate { get; set; }
}
public class Student : Person
{
public DateTime EnrollmentDate { get; set; }
}
然后“dotnet ef database update”将创建一个名为 Person 的单个 table,其中包含一个 Discriminator 列(table-per-hierarchy 继承)。
CREATE TABLE [dbo].[Person](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Discriminator] [nvarchar](max) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[HireDate] [datetime2](7) NULL,
[EnrollmentDate] [datetime2](7) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
问题:是否可以使用“dotnet ef dbcontext scaffold”从 Person 数据库 table 重新创建三个 类?
谢谢
我不会大胆的说'NO'。相反,我只是说到目前为止我一直是手动完成的,因为我个人还没有遇到任何为自动脚手架指定此方法的方法,我无法想象这样的工具如何工作。
第一个问题是鉴别器列可以是任意列。虽然这可以通过简单地使用命令行开关指定鉴别器的名称然后为每个不同的值生成一个 class 来解决,但还有一个更大的问题:无法分辨哪个列属于哪个 class. scaffolder 唯一可以做的就是将所有不可为 null 的内容放入基 class。但是可为空的列呢?它们是否可以为空,因为它们是基础 class 的一部分并且被指定为可以为空(明确地或按照惯例),或者它们是否可以为空,因为它们在后代 class 之一中?如果他们在后代 classes 中,在哪一个?没有办法告诉为什么列为空;是因为它在另一个 class 中,还是因为它在代表该对象的记录中此刻没有值?
但是,公平地说,重新设计脚手架代码并没有那么多工作。
- 搭建模型
- 创建后代classes
- 只需将基础 class 的属性剪切并粘贴到后代
- 删除鉴别器属性
- 设置继承以使用鉴别器并使用匹配值(EF Core 参见此处:https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance)