Вы хотите, чтобы каждый Person
имел ноль или более Vehicles
, а каждый Vehicle
принадлежит ровно одному Person
.
Чтобы выразить это более четко, я бы использовал оба объявления. Это будет легче для будущих читателей вашего кода. Кроме того, ваши запросы не нуждаются в объединении.
class Person
{
public int Id { get; set; }
public string Name { get; set; }
// every Person has zero or more Vehicles:
public virtual ICollection<Vehicle> Vehicles { get; set; }
}
class Vehicle
{
public int Id { get; set; }
public string LicenseNumber { get; set; }
// every vehicle belongs to exactly one Person using foreign key
public int PersonId {get; set;}
public virtual Person Person {get; set;}
}
Возможно, Владелец будет лучшим именем для Владельца этого Транспортного средства.
Обратите внимание, что я объявил все столбцы таблиц. Отношения между таблицами объявлены виртуальными: они не являются реальной частью таблицы.
Я изменил List<Vehicle>
на ICollection<Vehicle>
. В конце концов, будет Vehicle[4]
иметь определенное значение?
Кроме того, ваши отношения между таблицами будут более понятными для читателя, ваши запросы будут проще:
«Дайте мне идентификатор и имена всех лиц, имеющих два или более транспортных средств»
var result = myDbcontext.Persons
.Where(person => person.Vehicles.Count >= 2)
.Select(person => new
{
Id = person.Id,
Name = person.Name,
})
«Дайте мне имена и фамилии всех лиц с их транспортными средствами старше ...»
var result = myDbContext.Persons.Select(person => new
{
Id = person.Id,
Name = person.Name,
OldVehicles = person.Vehicles
.Where(vehicles => vehicle.CreationDate < OldDate)
.ToList(),
});
"Дайте мне все старые транспортные средства вместе с идентификатором и именем их владельца"
var result = myDbContext.Vehicles
.Where(vehicle => vehicle.CreationDate < OldDate)
.Select(vehicle => new
{
LicenseNumber = vehicle.LicenseNumber,
Owner = new
{
Id = vehicle.Person.Id,
Name = vehicle.Person.Name,
},
});
Используя связи между таблицами, вам больше не нужно присоединяться к внешнему ключу. Entity Framework поймет, что требуется объединение (не уверен, действительно ли это также для ef-core)