перечислить сущность детей - PullRequest
1 голос
/ 18 января 2010

Мне нужно создать метод, который будет принимать сущность Linq-to-sql и возвращать список всех его дочерних (только 1-го поколения) наборов сущностей, без каких-либо данных, которые содержат наборы сущностей, только имена. Есть ли способ, которым я могу это сделать? Спасибо

1 Ответ

1 голос
/ 18 января 2010

Что ж, если я правильно понимаю ваш вопрос, вы можете проверить метамодель для экземпляра контекста данных. Мета-модель описывает таблицы, столбцы и ассоциации в вашей модели. По сути, вы хотите посмотреть на ассоциации на столе, где ассоциация 1-ко-многим.

Это не требует извлечения каких-либо данных, поскольку вы фактически не работаете с экземплярами сущностей, а только информацией, которая их описывает.

Этот код должен сделать это:

public static string[] GetChildEntities<T>(DataContext context, T entity)
{
   var mapping = context.Mapping.GetTable(typeof(T));
   return mapping.RowType.Associations.Where(a => a.IsMany)
                                      .Select(a => a.ThisMember.Name).ToArray();
}

Это вернет имена любых свойств, которые предоставляют экземпляры EntitySet для данного родительского объекта.

EDIT

Этот код находит первую ассоциацию 1 -> * между родительскими и дочерними объектами на основе метамодели, получает значение свойства EntitySet для родительского объекта и добавляет дочерний объект в этот набор. Это должно работать для большинства базовых реализаций LINQ to SQL.

public static void AddChild<P, C>(DataContext context, P parent, C child) 
    where P : class
    where C : class
{
    var parentMapping = context.Mapping.GetTable(typeof(P));
    var childAssociation = 
             parentMapping.RowType.Associations
                     .Where(a => a.IsMany && a.OtherType.Type == typeof(C))
                     .FirstOrDefault();

    if (childAssociation != null)
    {
        var entitySet = (EntitySet<C>) childAssociation.ThisMember
                                                       .MemberAccessor
                                                       .GetBoxedValue(parent);
        entitySet.Add(child);
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...