在EF Code First中映射自引用实体

在我的数据库中,我有一个表类别,列ID,CategoryName,ParentCategoryId,其中ParentCategoryId对Category.Id有约束。

我首先使用实体​​框架代码,实体看起来像:

public class Category { public long Id { get; private set; } public string CategoryName { get; private set; } public long? ParentCategoryId { get; private set; } public Category ParentCategory { get; private set; } public virtual ICollection SubCategories { get; private set; } } 

如果我尝试对此运行查询,我会得到exception:

  The relationship 'ComplaintModel.FK_Complaint_Category' was not loaded because the type 'ComplaintModel.Category' is not available.\r\nThe following information may be useful in resolving the previous error:\r\nThe required property 'Category1' does not exist on the type 'EC.Complaint.Services.Command.Domain.Entities.Category'.\r\n\r\n"} System.Exception {System.Data.MetadataException} 

所以它似乎需要导航属性,如果我添加这些:

  public ICollection Category1 { get; private set; } public long? Category2Id { get; private set; } public Category Category2 { get; private set; } 

查询有效。

但是,当然,我不想要Category1和Category2属性,我想要使用ParentCategory和SubCategories属性。

如何告诉代码首先使用正确的导航属性?

你的POCO课应该是这样的……

 public class Category { public long Id { get; private set; } public string CategoryName { get; private set; } public long? ParentCategoryId { get; private set; } public virtual Category ParentCategory { get; private set; } public virtual ICollection SubCategories { get; private set; } } public class CategoryConfiguration : EntityTypeConfiguration { public CategoryConfiguration() { this.HasKey(x => x.Id); this.HasMany(category => category.SubCategories) .WithOptional(category => category.ParentCategoryId) .HasForeignKey(course => course.UserId) .WillCascadeOnDelete(false); } } 

entity framework6处理此问题。 您必须确保[Key]注释用于标识主键。 不确定它是否适用于虚拟关键字。

  public class Category { [Key] public long Id { get; private set; } public string CategoryName { get; private set; } public long? ParentCategoryId { get; private set; } public Category ParentCategory { get; private set; } public ICollection SubCategories { get; private set; } } 

我想我找到了它,我在OnModelCreating操作中添加了以下内容:

  modelBuilder.Entity().HasOptional(c => c.ParentCategory).WithMany().Map(m => m.MapKey(new string[] { "Id", "ParentCategoryId" })); 

现在ParentCategory和SubCategories属性工作(我可以删除Category1和Category2)。 不知道究竟为什么SubCategories有效…