C# EF 6未生成某些类的所有继承字段

C# EF 6未生成某些类的所有继承字段,c#,entity-framework-6,sql-server-2016,C#,Entity Framework 6,Sql Server 2016,另一方面,添加以下类: TABLE [dbo].[AppUsers]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](max) NOT NULL, [LoginName] [nvarchar](max) NOT NULL, [PasswordStored] [nvarchar](max) NOT NULL, [DateInsert] [datetime] NOT NULL, [DateUpdate] [datetime] NULL, [

另一方面,添加以下类:

TABLE [dbo].[AppUsers](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NOT NULL,
[LoginName] [nvarchar](max) NOT NULL,
[PasswordStored] [nvarchar](max) NOT NULL,
[DateInsert] [datetime] NOT NULL,
[DateUpdate] [datetime] NULL,
[UserInsert_Id] [int] NOT NULL
在上下文中添加DbSet会生成所有字段

public class Company : TableBase
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string OldCompanyReference { get; set; }  
}
公共数据库集公司{get;set;}
表[dbo].[公司](
[Id][int]标识(1,1)不为空,
[Name][nvarchar](最大值)NULL,
[OldCompanyReference][nvarchar](最大值)NULL,
[DateInsert][datetime]不为空,
[DateUpdate][datetime]空,
[UserInsert_Id][int]不为空,
[UserUpdate_Id][int]NULL,

那么我遗漏了什么呢?

它与继承没有任何共同之处-如果删除继承并将
TableBase
属性复制到
AppUser
,同样的情况也会发生

问题是
AppUser
有2个self引用-
UserInsert
UserUpdate
。由于第一个标记为必需,第二个标记为可选,因此按照约定,EF将它们映射到一个一对一的FK关系,其中
UserUpdate
的反向导航属性>UserInsert
。这当然不是您的意图

通常,当EF常规映射无法产生所需结果时,您需要使用数据注释和/或fluent API。在这种特殊情况下-fluent API。最低要求如下:

public DbSet<Company> Companies { get; set; }

TABLE [dbo].[Companies](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NULL,
[OldCompanyReference] [nvarchar](max) NULL,
[DateInsert] [datetime] NOT NULL,
[DateUpdate] [datetime] NULL,
[UserInsert_Id] [int] NOT NULL,
[UserUpdate_Id] [int] NULL,
modelBuilder.Entity()
.has可选(e=>e.UserInsert)
.有许多();
通过这种方式,您可以告诉EF创建一对多关系,其中一边是
UserInsert
reference导航属性,另一边是no collection导航属性。这样做的另一个效果是,当EF找到未映射的
UserUpdate
reference导航属性时,按照惯例,它会创建一个另一个一对多单向关系。它将在末尾创建两个FK列,与非自引用实体示例一样

还要注意的是,在自引用实体
AppUser
中,
UserInsert
不是必需的,因为否则您将无法创建任何
AppUser
记录。这就是为什么我使用
HasOptional
而不是
HasRequired
,它覆盖了基类属性
required
数据仅用于该实体的符号

public DbSet<Company> Companies { get; set; }

TABLE [dbo].[Companies](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NULL,
[OldCompanyReference] [nvarchar](max) NULL,
[DateInsert] [datetime] NOT NULL,
[DateUpdate] [datetime] NULL,
[UserInsert_Id] [int] NOT NULL,
[UserUpdate_Id] [int] NULL,
modelBuilder.Entity<AppUser>()
    .HasOptional(e => e.UserInsert)
    .WithMany();