Автоматическая настройка для сопоставления «многие ко многим» с помощью таблицы соединений (EF Core 2.2) - PullRequest
0 голосов
/ 02 ноября 2019

Я использую EF Core 2.2. У меня есть самоссылающаяся сущность «VehicleComponentEntity». Отношение «многие ко многим» возможно только с таблицей соединений в ef core 2.2.

Мои объекты и OnModelCreating в моем тексте данных:

public abstract class BaseEntity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
}

public class VehicleComponentEntity : BaseEntity
{
    public string Name { get; set; }
    public virtual ICollection<VehicleComponentJoinEntity> ChildComponents { get; set; }
}

public class VehicleComponentJoinEntity : BaseEntity
{
    public int VehicleComponentId { get; set; }
    public virtual VehicleComponentEntity VehicleComponent { get; set; }

    public int ChildVehicleComponentId { get; set; }
    public virtual VehicleComponentEntity ChildVehicleComponent { get; set; }
}

...

 //Many-To-Many with EF Core < 3.0
 //https://stackoverflow.com/questions/49214748/many-to-many-self-referencing-relationship/49219124#49219124
modelBuilder.Entity<VehicleComponentJoinEntity>()
    .HasOne(vc => vc.ChildVehicleComponent)
    .WithMany()
    .HasForeignKey(vc => vc.ChildVehicleComponentId)
    .OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<VehicleComponentJoinEntity>()
    .HasOne(vj => vj.VehicleComponent)
    .WithMany(v => v.ChildComponents)
    .HasForeignKey(vj => vj.VehicleComponentId);

...

Моя модель / интерфейс для отображения из и всущность:

public interface IVehicleComponent
{
    int Id { get; set; }
    string Name { get; set; }
    ICollection<IVehicleComponent> ChildComponents { get; set; }
}

Я не знаю, как я могу создать настройку автоматического средства.

Моя текущая конфигурация автоматического средства настройки:

var mapConfig = new MapperConfiguration(config =>
    {
        config.CreateMap<IVehicleComponent, VehicleComponentEntity>()
            .ForMember(entity => entity.ChildComponents, opt => opt.MapFrom(model => model.ChildComponents));
        config.CreateMap<IVehicleComponent, VehicleComponentJoinEntity>()
            .ForMember(entity => entity.VehicleComponent, opt => opt.MapFrom(model => model));

        config.CreateMap<VehicleComponentEntity, IVehicleComponent>()
            .ForMember(model => model.ChildComponents, opt => opt.MapFrom(entity => entity.ChildComponents));
        config.CreateMap<VehicleComponentJoinEntity, IVehicleComponent>()
            .ForMember(model => model.Id, opt => opt.MapFrom(entity => entity.ChildVehicleComponent.Id))
                    .ForMember(model => model.Name, opt => opt.MapFrom(entity => entity.ChildVehicleComponent.Name));
    });

Но это не похожеправильно.

Мой тестовый код:

var vehicleComponent1 = new VehicleComponent { Id = 0, Name = "Component 1" };
var vehicleComponent2 = new VehicleComponent { Id = 1, Name = "Component 2" };
var vehicleComponent3 = new VehicleComponent 
                        { 
                            Id = 2, 
                            Name = "Component 3", 
                            ChildComponents = new List<IVehicleComponent> 
                            { 
                                vehicleComponent1, 
                                vehicleComponent2 
                             } 
                         };

var vehicleComponentEntity = Mapper.Map<VehicleComponentEntity>(vehicleComponent3);

После сопоставления с IVehicleComponent в VehicleComponentEntity. Все свойства (Id, Name) сопоставлены с IVehicleComponent и VehicleComponentEntity. Список с дочерними компонентами (ICollection), но Id объекта VehicleComponentJoinEntity сопоставляется с идентификатором die дочернего компонента.

Я надеюсь, что смогу объяснить проблему. Как будет правильное отображение?

Спасибо за помощь.

...