Я не вижу твоей проблемы. Очевидно, вы используете C #, который содержит объекты в качестве ссылок, а не экземпляров. Это означает, что совершенно нормально иметь перекрестные ссылки или даже собственные ссылки.
в C ++ и других языках, где объекты более сложны, чем у вас, могут возникнуть проблемы, которые обычно решаются с помощью ссылок или указателей, но C # должен подойти.
Скорее всего, ваша проблема в том, что вы пытаетесь каким-то образом следовать всем ссылкам, что приводит к циклической ссылке. LINQ использует отложенную загрузку для решения этой проблемы. Например, LINQ не будет загружать компанию или сотрудника, пока вы не ссылаетесь на них. Вам просто нужно избегать таких ссылок дальше, чем один уровень.
Однако вы не можете добавить две таблицы в качестве внешнего ключа друг друга, иначе вы никогда не сможете удалить какую-либо запись, поскольку удаление сотрудника потребует сначала удаления компании, но вы не можете удалить компанию без удаляя сотрудника. Как правило, в этом случае вы будете использовать только один в качестве реального внешнего ключа, другой будет просто псевдо-FK (то есть тот, который используется в качестве FK, но не имеет включенных ограничений). Вы должны решить, какие отношения важнее.
В примере компании вы, скорее всего, захотите удалить сотрудника, но не компанию, поэтому сделайте компанию -> сотрудник FK связующим отношением. Это предотвращает удаление компании, если есть сотрудники, но вы можете удалять сотрудников, не удаляя компанию.
Кроме того, избегайте создания новых объектов в конструкторе в этих ситуациях. Например, если ваш объект Employee создает новый объект Company, который включает в себя новый объект employee, созданный для сотрудника, он в конечном итоге исчерпает память. Вместо этого передайте объекты, уже созданные в конструктор, или установите их после построения, возможно, с помощью метода инициализации.
Например:
Company c = GetCompany("ACME Widgets");
c.AddEmployee(new Employee("Bill"));
затем, в AddEmployee, вы устанавливаете компанию
public void AddEmployee(Employee e)
{
Employees.Add(e);
e.Company = this;
}