Entity Framework Core и сложный объект-значение - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь смоделировать сущность со сложным объектом значения.

Структура базы данных может выглядеть примерно так:

+-------------------------------------+
|                car                  |
+----------------------+--------------+
| id                   | CHAR(40)     |
+----------------------+--------------+
| model                | VARCHAR(255) |
+----------------------+--------------+
| specs_engine_version | VARCHAR(255) |
+----------------------+--------------+
| specs_lighting       | VARCHAR(255) |
+----------------------+--------------+


+------------------------------------+
|      specs_interior_equipment      |
+-----------------------+------------+
| car_id                | CHAR(40)   |
+-----------------------+------------+
| interior_equipment_id | INT(11)    |
+-----------------------+------------+

Это сущность Car:

public class Car : IEntity<Guid>
{
    public Guid Id { get; private set; }
    public string Model { get; private set; }

    public Specs Specs { get; set; }

    public Car()
    { }
}

Это объект значения Specs:

public class Specs : ValueObject<Specs>
{
    public string EngineVersion { get; private set; }
    public string Lighting { get; private set; }
    public List<int> InteriorEquipment { get; private set; }

    public Specs()
    {}
}

Я настраиваю сопоставления более или менее так:

class CarMap : IEntityTypeConfiguration<Car>
{
    public void Configure(EntityTypeBuilder<Car> builder)
    {
        builder.HasKey(t => t.Id);
        builder.ToTable("car");
        builder.Property(e => e.Id).HasColumnName("id");
        builder.Property(e => e.Name).HasColumnName("name");
        builder.OwnsOne(j => j.Specs, l =>
        {
            l.Property(t => t.EngineVersion).HasColumnName("specs_engine_version");
            l.Property(t => t.Lighting).HasColumnName("specs_lighting");
        });
    }
}

Вопрос это: как мне настроить сопоставления, чтобы сохранить внутреннее оборудование в отдельной таблице?

Я знаю, что могу определить внутреннее оборудование как объект, использующий что-то вроде этого:

builder
    .HasMany(j => j.InteriorEquipment)
    .WithOne()
    .HasForeignKey(t => t.CarId)
    .OnDelete(DeleteBehavior.Cascade)
    .Metadata.PrincipalToDependent.SetPropertyAccessMode(PropertyAccessMode.Field);

но я не знаю, как объединить все части ...

Не могли бы вы мне помочь?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Мар c

Я думаю, в вашем случае вам нужен отдельный класс для построения спецификаций таблицы, это не должно быть сделано в классе автомобилей Что-то вроде:

class SpecMap : IEntityTypeConfiguration<Spec>

затем вы можете добавить функцию в вызовы вашего репозитория для извлечения всей информации.

Здесь я опубликую вам, как мы решаем эту проблему в InfoJobs, надеюсь, это поможет вам.

Класс-кандидат указывает на CandidateResumeDeficiencies, поэтому у Candidate может быть список CandidateResumeDeficiencies.

-> CandidateResumeClass

publi c класс CandidateResume: BaseEntity, IAregreg # #regreg .: Свойства:.

    public int IdCandidateResume { get; protected set; }
    public int IdCandidate { get; protected set; }
    ....
 }

-> Класс дефицита

public class CandidateResumeDeficiency
{
    public int IdCandidateResumeDeficiency { get; private set; }
    public int IdCandidateResume { get; private set; }
    public int IdDeficiency1 { get; private set; }
    ...
}

-> Строитель

class CandidateEntityTypeConfiguration : IEntityTypeConfiguration<Candidate>
{
    public void Configure(EntityTypeBuilder<Candidate> builder)
    {
        builder.ToTable("candidates",    EFContext.DbSchema.candidate.ToString());

        builder.HasKey(b => b.IdCandidate);
        builder.HasAlternateKey(b => new { b.IdCompany, b.Email });

    }

}

class CandidateResumeDeficiencyEntityTypeConfiguration : IEntityTypeConfiguration<CandidateResumeDeficiency>
{
    public void Configure(EntityTypeBuilder<CandidateResumeDeficiency> builder)
    {
        builder.ToTable("candidateresumedeficiencies", EFContext.DbSchema.candidate.ToString());

        builder.HasKey(b => b.IdCandidateResumeDeficiency);
    }
}

-> Репозиторий

 public class CandidateResumeRepository : EFRepository<CandidateResume, int>, ICandidateResumeRepository
{
    public CandidateResumeRepository(EFContext dbContext) : base(dbContext)
    {
    }

    public async Task<CandidateResume> GetFullAsync(int idCandidateResume) =>
        await ((EFContext)_dbContext).CandidateResumes

                                              .Include(c => c.Deficiencies)

                                 .FirstOrDefaultAsync(c => c.IdCandidateResume == idCandidateResume);

}

0 голосов
/ 15 апреля 2020

Я нашел решение для сохранения разделения таблицы, используя объект для представления оборудования.

Это конфигурация отображения:

class CarMap : IEntityTypeConfiguration<Car>
{

    public void Configure(EntityTypeBuilder<Car> builder)
    {
        builder.HasKey(t => t.Id);

        builder.ToTable("car");

        builder.Property(e => e.Id).HasColumnName("id");
        builder.Property(e => e.Name).HasColumnName("name");

        builder.OwnsOne(j => j.Specs, l =>
        {
            l.Property(t => t.EngineVersion).HasColumnName("specs_engine_version");
            l.Property(t => t.Lighting).HasColumnName("specs_lighting");

            l.OwnsMany(x => x.InteriorEquipment, x =>
            {
                x.HasKey(t => t.Id);

                x.WithOwner().HasForeignKey("CarId");

                x.ToTable("specs_interior_equipment");

                x.Property(j => j.Id).HasColumnName("id");
                x.Property(j => j.CategoryId).HasColumnName("equipment_id");
                x.Property(j => j.CarId).HasColumnName("car_id");
            });
        });
    }
}

, а это объект оборудования:

public class Equipment: TEntity<Guid>
{


    private Equipment() { }


    public Equipment(Guid carId, int equipmentId)
    {
        Id = Guid.NewGuid();
        CarId = carId;
        EquipomentId = equipmentId;
    }


    public Guid Id { get; internal set; }
    public Guid CarId { get; internal set; }
    public int EquipmentId { get; internal set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...