Можно отобразить исходные классы, но совершенно нелогичным способом.
Поскольку класс Vehicles
является просто контейнером, отображение его как принадлежащего объекту, как вы пытались, кажется наиболее естественным способом.Однако в настоящее время EF Core не позволяет принадлежащему объекту быть на главной стороне отношений, и в вашем случае это необходимо.
Таким образом, вместо этого вам нужно отобразить класс Vehicles
как обычную "сущность", разделяющую ту же таблицу с Customer
- так называемое разбиение таблицы .Вы должны сделать все, что EF Core делает неявным образом для принадлежащих объектов, - определите свойство shadow , а map - это и PK, и FK для отношения один-к-одному с Customer
.Вам также необходимо явно отобразить Vehicle.CustomerId
как FK, поскольку с точки зрения EF Vehicle
относится к Vehicles
, а не к Custome
, следовательно, предполагаемое имя свойства / столбца обычного FK будет VehiclesId
.Обратите внимание, что с этой моделью вы никогда не сможете определить свойство обратной навигации Customer
из Vehicle
.
С учетом сказанного, здесь необходима свободная конфигурация:
modelBuilder.Entity<Vehicles>(builder =>
{
// Table
builder.ToTable(modelBuilder.Entity<Customer>().Metadata.Relational().TableName);
// PK
builder.Property<int>("Id");
builder.HasKey("Id");
// One-to-one relationship with Customer
builder.HasOne<Customer>()
.WithOne(e => e.Vehicles)
.HasForeignKey<Vehicles>("Id");
// One-to-many relationship with Vehicle
builder.HasMany(e => e.Items)
.WithOne()
.HasForeignKey(e => e.CustomerId);
});
и использование:
db.Customers
.Include(x => x.Vehicles.Items) // <--
// ...