Я использую 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 дочернего компонента.
Я надеюсь, что смогу объяснить проблему. Как будет правильное отображение?
Спасибо за помощь.