C# 为什么EF代码首先为我的导航属性生成列?

C# 为什么EF代码首先为我的导航属性生成列?,c#,entity-framework,C#,Entity Framework,我想先弄清楚如何配置EF代码,生成一个表。我遇到的问题是我不确定如何正确配置表。该表与自身具有父子关系。我更喜欢使用FluentAPI配置而不是属性的解决方案 EF正在生成下表: Specification ------------- SpecificationId Name ParentSpecificationId ParentSpecification_SpecificationId 下面是课堂: public class Specification { public Speci

我想先弄清楚如何配置EF代码,生成一个表。我遇到的问题是我不确定如何正确配置表。该表与自身具有父子关系。我更喜欢使用FluentAPI配置而不是属性的解决方案

EF正在生成下表:

Specification
-------------
SpecificationId
Name
ParentSpecificationId
ParentSpecification_SpecificationId
下面是课堂:

public class Specification
{
    public Specification()
    {
        Children = new Collection<Specification>();
    }

    public int SpecificationId { get; set; }
    public string Name { get; set; }
    public int? ParentSpecificationId { get; set;}
    public virtual Specification ParentSpecification { get; set;}
    public virtual ICollection<Specification> Children { get; set;}
}
公共类规范
{
公共规范()
{
Children=新集合();
}
公共int规范ID{get;set;}
公共字符串名称{get;set;}
public int?ParentSpecificationId{get;set;}
公共虚拟规范ParentSpecification{get;set;}
公共虚拟ICollection子项{get;set;}
}
我根据问题尝试了下面的配置

公共类规范配置:EntityTypeConfiguration
{
公共规范配置()
{
可更改(“规格”);
HasKey(k=>k.SpecificationId);
属性(p=>p.SpecificationId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(t=>t.ParentSpecification)
.有很多(t=>t个孩子)
.HasForeignKey(t=>t.ParentSpecificationId)
.WillCascadeOnDelete(假);
has可选(t=>t.Children)
.有很多
.HasForeignKey(t=>t.SpecificationId)
.WillCascadeOnDelete(假);
}
}
我的配置有什么问题和/或如何让EF停止生成ParentSpecification\u SpecificationId并将值放入ParentSpecificationId

注意:EF正在生成的列中输入正确的值。

如下(EF 6.1.3):


我得到了同样的结果。EF仍在生成4列。添加记录时,它仍然保留ParentSpecificationId为null,并使用完整的示例填充ParentSpecificationId列更新的答案。你知道当你做一些愚蠢的事情时,比如忘记将配置类添加到上下文中,是的,我做到了。
public class SpecificationConfiguration : EntityTypeConfiguration<Specification>
{
    public SpecificationConfiguration()
    {
        ToTable("Specification");
        HasKey(k => k.SpecificationId);
        Property(p => p.SpecificationId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasRequired(t => t.ParentSpecification)
        .WithMany(t => t.Children)
        .HasForeignKey(t => t.ParentSpecificationId)
        .WillCascadeOnDelete(false);

        HasOptional(t => t.Children)
        .WithMany()
        .HasForeignKey(t => t.SpecificationId)
        .WillCascadeOnDelete(false);
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{



    public class Specification
    {
        public int SpecificationId { get; set; }

        public string Name { get; set; }

        public int? ParentSpecificationId { get; set; }

        public virtual Specification ParentSpecification { get; set; }

        public virtual ICollection<Specification> Children { get; } = new HashSet<Specification>();
    }

    public class Db : DbContext
    {
        public DbSet<Specification> Specifications { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Specification>()
                        .HasMany(s => s.Children)
                        .WithOptional(s => s.ParentSpecification)
                        .HasForeignKey(s => s.ParentSpecificationId)
                        .WillCascadeOnDelete(false);

            base.OnModelCreating(modelBuilder);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {


            Database.SetInitializer(new DropCreateDatabaseAlways<Db>());

            using (var db = new Db())
            {
                db.Database.Log = m => Console.WriteLine(m);

                db.Database.Initialize(false);


                Console.ReadKey();
            }
        }
    }
}
    CREATE TABLE [dbo].[Specifications] (
        [SpecificationId] [int] NOT NULL IDENTITY,
        [Name] [nvarchar](max),
        [ParentSpecificationId] [int],
        CONSTRAINT [PK_dbo.Specifications] PRIMARY KEY ([SpecificationId])
    )


    -- Executing at 6/30/2017 12:54:33 PM -05:00

    -- Completed in 24 ms with result: -1



    CREATE INDEX [IX_ParentSpecificationId] ON [dbo].[Specifications]([ParentSpecificationId])


    -- Executing at 6/30/2017 12:54:33 PM -05:00

    -- Completed in 8 ms with result: -1



    ALTER TABLE [dbo].[Specifications] 
    ADD CONSTRAINT [FK_dbo.Specifications_dbo.Specifications_ParentSpecificationId] 
    FOREIGN KEY ([ParentSpecificationId]) 
    REFERENCES [dbo].[Specifications] ([SpecificationId])