Entity Framework 4.1 Извлечение самоссылающихся данных - PullRequest
6 голосов
/ 14 июля 2011

Сначала я использую код Entity Framework 4.1 и ASP.NET MVC 3, и я изо всех сил пытаюсь правильно настроить самоссылку.У меня есть категория Категория.Это должно быть самореференция к себе.Категория может быть родительской категорией, когда ParentCategoryId в таблице равен нулю.Если у категории есть ParentCategoryId со значением, то это означает, что она принадлежит родительской категории.

Я следовал этой статье в Code Project.

Вот моя категориякласс:

public class Category
{
     public int Id { get; set; }
     public string Name { get; set; }
     public string Description { get; set; }
     public string MetaKeywords { get; set; }
     public string MetaDescription { get; set; }
     public bool IsActive { get; set; }
     public virtual Category ParentCategory { get; set; }
     public int? ParentCategoryId { get; set; }
}

Мой класс контекста:

public class PbeContext : DbContext
{
     public DbSet<Category> Categories { get; set; }

     protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
     {
          dbModelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

          dbModelBuilder.Entity<Category>()
               .HasOptional(c => c.ParentCategory)
               .WithMany()
               .HasForeignKey(p => p.ParentCategoryId);
     }
}

Не уверен, что вышеприведенное верно?

Может кто-нибудь помочь мне понять это правильно?Что мне нужно, так это то, что когда я запрашиваю категорию по идентификатору, она должна возвращать родительскую категорию (загружается только при необходимости).Также он должен загружать любые дочерние категории (только при необходимости).Я еще не добавил список в класс категорий для дочерних категорий.

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

РЕДАКТИРОВАТЬ

Вот так я получаю свою категорию:

public Category GetById(int id)
{
     return db
          .Categories
          .Find(id);
}

Поскольку ссылка ParentCategory может быть нулевой, как мне отобразить это в представлении?У меня есть следующее:

@Model.ParentCategory.Name

.. но не выдаст ли это ошибку, если у категории нет родительской категории, связанной с ней?Как бы я отобразил это в виде?

1 Ответ

7 голосов
/ 14 июля 2011

Если вам нужен доступ к дочерним категориям, вы можете добавить свойство коллекции в вашу модель

public class Category
{
     public int Id { get; set; }
     public string Name { get; set; }
     public string Description { get; set; }
     public string MetaKeywords { get; set; }
     public string MetaDescription { get; set; }
     public bool IsActive { get; set; }
     public virtual Category ParentCategory { get; set; }
     public int? ParentCategoryId { get; set; }
     public virtual ICollection<Category> ChildCategories{ get; set; }
}

Тогда вы можете установить модель как

      dbModelBuilder.Entity<Category>()
           .HasOptional(c => c.ParentCategory)
           .WithMany(c => ChildCategories)
           .HasForeignKey(p => p.ParentCategoryId);

Редактировать

Вы должны проверить, является ли ParentCategory нулевым или нет.

@if(Model.ParentCategory != null){
  <div>@Model.ParentCategory.Name</div>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...