Что ж, если я правильно понимаю ваш вопрос, вы можете проверить метамодель для экземпляра контекста данных. Мета-модель описывает таблицы, столбцы и ассоциации в вашей модели. По сути, вы хотите посмотреть на ассоциации на столе, где ассоциация 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);
}
}