Отображение для самоссылающейся сущности в EF Code First - PullRequest
6 голосов
/ 13 марта 2012

В моей базе данных у меня есть таблица Category, со столбцами 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<Category> SubCategories { get; private set; }
}

Если я попытаюсь выполнить запрос для этого, я получу исключение:

 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<Category> Category1 { get; private set; }
 public long? Category2Id { get; private set; }
 public Category Category2 { get; private set; }

запрос работает.

Но, конечно, я не хочу, чтобы свойства Category1 и Category2, я хочу использовать свойства ParentCategory и SubCategories.

Как мне сказатьсначала код, чтобы использовать правильные свойства навигации?

Ответы [ 3 ]

8 голосов
/ 13 марта 2012

ваш класс 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<Category> SubCategories { get; private set; }
}

public class CategoryConfiguration : EntityTypeConfiguration<Category>
{
    public CategoryConfiguration()
    {
        this.HasKey(x => x.Id);

        this.HasMany(category => category.SubCategories)
            .WithOptional(category => category.ParentCategoryId)
            .HasForeignKey(course => course.UserId)
            .WillCascadeOnDelete(false);
    }
}
4 голосов
/ 14 июня 2014

Entity Framework 6 обрабатывает это.Вы просто должны убедиться, что аннотация [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<Category> SubCategories { get; private set; }
}
0 голосов
/ 13 марта 2012

Я думаю, что нашел его, я добавил следующее в операцию OnModelCreating:

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

, и теперь свойства ParentCategory и SubCategories работают (и я мог удалить Category1 и Category2).Хотя точно не знаю, почему работает подкатегория ...

...