EF Core .NET CLI是否支持脚手架的继承?

时间:2017-11-30 15:34:18

标签: c# entity-framework ef-core-2.0

参加以下课程:

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数据库更新"将创建一个名为Person的表,其中包含一个Discriminator列(每个层次的表继承)。

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
)
) 

enter image description here

问题:是否可以使用" dotnet ef dbcontext scaffold "?

从Person数据库表中重新创建三个类

由于

1 个答案:

答案 0 :(得分:2)

我不会大胆地继续说'不'。相反,我只是说到目前为止我总是手动完成它,因为我个人没有遇到任何为自动脚手架指定这个的方法,我无法想象这样的工具如何工作。

第一个问题是鉴别器列可以是任意列。虽然这可以通过简单地用命令行开关指定鉴别器的名称然后为每个不同的值生成一个类来解决,但是有一个更大的问题:没有办法分辨哪个列属于哪个类。脚手架唯一可以做的就是将所有不可空的东西放到基类中。但是那些可以为空的列呢?它们是否可以为空,因为它们是基类的一部分并被指定为可空(显式或通过约定),或者它们是否可以为空,因为它们位于其中一个后代类中?如果他们在后代班,哪一个?没有办法告诉为什么列是空的;是因为它在另一个类中,还是因为它在表示对象的记录中没有值?

但是,公平地说,重新设计脚手架代码并不是那么多工作。

  1. 支持模型
  2. 创建后代类
  3. 只需将属性从基类剪切并粘贴到后代
  4. 即可
  5. 删除鉴别器属性
  6. 设置继承以使用Discriminator并使用匹配值(请参阅此处了解EF Core:https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance