У меня настроены следующие объекты.
public class Car
{
public int Id { get; protected set; }
public HashSet<Wheel> FrontWheels { get; set; };
public HashSet<Wheel> RearWheels { get; set; };
}
public class Wheel
{
public int Id { get; protected set; }
//public Car Car { get; set; }
public double Diameter { get; set; }
public double Width { get; set; }
}
Автомобиль имеет колеса.Он взаимодействует с фронтами и творится очень по-разному, и поэтому они хранятся в разных коллекциях.Колесо само по себе не является ни передним, ни задним (это может быть либо), но только благодаря его ассоциации с автомобилем ему присваивается положение на автомобиле.
Я могу настроить это в EFCore 2.1 с использованием следующей конфигурации:
modelBuilder.Entity<Car>().HasMany(car => car.FrontWheels).WithOne();
modelBuilder.Entity<Car>().HasMany(car => car.RearWheels).WithOne();
Это создает таблицу колес с двумя обнуляемыми столбцами fk, CarIdFrontWheel & CarIdRearWheel.Я понимаю, почему он создает два столбца и почему они обнуляются (для каждого ряда колес будет заполнен только 1 столбец fk, и этот столбец описывает положение на автомобиле).Эта схема описывает ситуацию, и я доволен этим.
Теперь проблема начинается, когда я хочу добавить обратно в закомментированное свойство обратной навигации - чтобы я мог перемещаться от Колеса к подключенному автомобилю.Однако я настраиваю его, EF всегда хочет добавить еще один fk с именем CarId в таблицу Wheel, чтобы отобразить обратно на автомобиль.Я понимаю, почему это нужно сделать - иначе я пытаюсь попросить одно свойство (Wheel.Car) принять участие в двух отношениях.Оба fks могут указывать на разные идентификаторы автомобилей и т. Д.
Однако то, что я спрашиваю, представляется логически обоснованным с точки зрения отношений сущностей.Если бы мы писали этот доступ к данным вручную, мы могли бы заставить схему работать без этого ненужного (несколько ненормализованного) третьего внешнего ключа.
- Возможно ли настроить эти объекты, используя только два (CarIdFrontWheel& CarIdRearWheel) внешние ключи?
- Должен ли я вместо этого просто принять существование внешнего ключа CarId?
- Или я могу внести некоторые изменения в свою модель, чтобы помочь в этой ситуации?