Чтобы ответить на вопрос, как это работает.
Рассмотрим у вас есть идентификатор компании, которую вы хотите получить все магазины для, вы можете просто сделать:
using (var dbcontext = new DbContext())
{
var stores = await dbcontext.Stores.Where(x => x.CompanyId == companyId).ToListAsync();
}
Вам не нужно навигационные свойства. У меня их никогда не было, они только когда-либо вызывали у меня проблемы, я не говорю, что они вызовут у вас проблемы. Это всего лишь удобная вещь (по тому, что кажется), которая, по моему мнению, скрывает базовое представление SQL и запросы EF могут работать. Теперь будет несколько запросов, которые вы действительно заботитесь о генерации EF, когда вы доберетесь до них, вы обнаружите, что свойства навигации препятствуют вам.
Если вы хотите сохранить записи, просто назначьте каждый Store
реальный Company.Id
, и вы выполните обязательства внешнего ключа.
Одно изменение, которое вы могли бы сделать (если это применимо к данному случаю) является то, что вы можете удалить int Id
и использовать CompanyId
в качестве первичного и внешнего ключа
public class Store
{
// public int Id; just remove this
public int CompanyId; // make this a foreign key using fluent or attributes.
public string Name;
public int NoOfEmployees;
public Guid GUID;
}
Это гарантирует, что вы сохраняете 1 ко многим отношений , , если эти многие должны существовать только для одной компании. Если нет, не беспокойтесь об этом.
Возможно, было бы удобно, чтобы у Компании был список, и действительно для Магазина иметь собственность Компании ... это упрощает навигацию –
NDJ
Если все в порядке, это зависит от того, что вы планируете с ней делать. И критерии «без использования виртуальных и хэшсетсов» немного неясны .... Я бы предпочел присвоить классу 'Company' свойство вроде' public List Магазины {get; set;} 'Это будет содержать все магазины принадлежащих этой компании. Таким образом, вы не всегда должны искать обратный поиск, в магазинах которого есть правильный 'CompanyId'. –
Я не согласен с тем, что виртуальные свойства или коллекции на объекте упрощают навигацию. То, что вы сделали, абсолютно нормально, одно изменение, которое я бы сделал, это то, что вам не понадобится 'int Id', потому что если store ** должен ** иметь компанию, тогда должно быть только «CompanyId» в качестве основного и внешнего ключа –