[英]Why is EF Code First generating a column for my navigation property?
我正在嘗試弄清楚如何配置EF Code First,以生成表。 我遇到的問題是我不確定如何正確配置表。 該表與其自身具有父子關系。 我更喜歡使用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;}
}
我根據此問題嘗試了以下配置
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);
}
}
我的配置有什么問題和/或如何獲得EF來停止生成ParentSpecification_SpecificationId並將其值放入ParentSpecificationId?
注意:EF在生成的列中輸入了正確的值。
像這樣(EF 6.1.3):
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])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.