мой первый раз на сайте так извиняюсь, если он неправильно помечен или получил ответ в другом месте...
Я постоянно сталкиваюсь с конкретной ситуацией в моем текущем проекте, и мне было интересно, как вы, ребята, справитесь с этим. Шаблон: родительский элемент с коллекцией дочерних элементов, а родитель имеет одну или несколько ссылок на определенные элементы в дочерней коллекции, обычно это "дочерний элемент по умолчанию".
Более конкретный пример:
public class SystemMenu
{
public IList<MenuItem> Items { get; private set; }
public MenuItem DefaultItem { get; set; }
}
public class MenuItem
{
public SystemMenu Parent { get; set; }
public string Name { get; set; }
}
Мне кажется, что это хороший чистый способ моделирования отношений, но сразу вызывает проблемы благодаря круговой ассоциации, я не могу принуждать отношения в БД из-за круговых внешних ключей, а LINQ to SQL взрывается из-за циклической ассоциации. Даже если бы я мог обманывать это, это явно не отличная идея.
Моя единственная идея в настоящее время состоит в том, чтобы в меню MenuItem был флаг IsDefault:
public class SystemMenu
{
public IList<MenuItem> Items { get; private set; }
public MenuItem DefaultItem
{
get
{
return Items.Single(x => x.IsDefault);
}
set
{
DefaultItem.IsDefault = false;
value.DefaultItem = true;
}
}
}
public class MenuItem
{
public SystemMenu Parent { get; set; }
public string Name { get; set; }
public bool IsDefault { get; set; }
}
Кто-нибудь имел дело с чем-то похожим и мог предложить некоторые советы?
Ура!
Изменить: спасибо за ответы до сих пор, возможно, пример "Меню" не был блестящим, хотя я пытался подумать о чем-то представительном, поэтому мне не пришлось вникать в специфику нашего не-себя -Экспланативная модель домена! Возможно, лучшим примером может быть отношение Компания/Сотрудник:
public class Company
{
public string Name { get; set; }
public IList<Employee> Employees { get; private set; }
public Employee ContactPerson { get; set; }
}
public class Employee
{
public Company EmployedBy { get; set; }
public string FullName { get; set; }
}
Сотруднику определенно нужна ссылка на их компанию, и каждая компания может иметь только одного ContactPerson. Надеюсь, что мой исходный пункт станет более понятным!