EF CTP5 самоссылочная модель с запросом - PullRequest
1 голос
/ 11 марта 2011

У меня есть класс POCO Menu со свойством дочерних ссылок:

public class Menu
{
   public int MenuID { get; set; }
   public int? ParentID { get; set; }
   public string Title { get; set; }
   ...
   public virtual Menu Parent { get; set; }
   public virtual ICollection<Menu> Children { get; set; }
}

Поскольку я не хочу фактически удалять какие-либо элементы меню, я установил их в базе данных как удаленные.
В запросе linq у меня нет проблем с исключением пунктов меню, помеченных как удаленные.

Моя проблема в том, что свойство Children включает в себя пункты меню, помеченные как удаленные, когда я комбинирую его с помощником древовидной структуры от Мэтта Хидигера: http://www.matthidinger.com/archive/2009/02/08/asp.net-mvc-recursive-treeview-helper.aspx.

childrenProperty (root) возвращаетэлементы, помеченные как удаленные:

private static void AppendChildren<T>(StringBuilder sb, T root, Func<T, IEnumerable<T>> childrenProperty, Func<T, string> itemContent)
{
    var children = childrenProperty(root);
    if (children.Equals(null) && !children.Any())
    {
        sb.AppendLine("</li>");
        return;
    }

    sb.AppendLine("\r\n<ul>");
    foreach (T item in children)
    {
        RenderLi(sb, item, liContent, itemContent);
        AppendChildren(sb, item, childrenProperty, liContent, itemContent);
    }

    sb.AppendLine("</ul></li>");
}

Возможно ли изменить отображение в OnModelCreating, чтобы оно включало запрос, в котором я могу исключить удаленные элементы меню?

Мое сопоставление, ссылающееся на себя:

modelBuilder.Entity<Menu>().HasMany(m => m.Children).WithOptional().HasForeignKey(m => m.ParentID);

Я не на том пути?Можно ли решить проблему по-другому?

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

Я переписал свой помощник html, чтобы отфильтровать элементы, помеченные как удаленные.

Сэмпл Мэтта Хидигера:

<%= Html.TreeView("locations", Model.Locations, l => l.ChildrenLocations, l => l.Name) %>

Мое исправление:

<%= Html.TreeView("locations", Model.Locations, l => l.ChildrenLocations.Where(x => x.Deleted == false), l => l.Name) %>

И, конечно, я обновил до последней версии платформы сущностей через Nuget.

0 голосов
/ 18 апреля 2011

не могли бы вы просто отфильтровать список перед его перечислением?

foreach (T item in children.Where(x => x.IsDeleted == false)
{
    RenderLi(sb, item, liContent, itemContent);
    AppendChildren(sb, item, childrenProperty, liContent, itemContent);
}
...