实体框架的核心和复杂的价值对象

马克

我正在尝试为具有复杂值对象的实体建模。

数据库结构可能类似于以下内容:

+-------------------------------------+
|                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);

但我不知道该如何参与...

你可以帮帮我吗?

马克

我找到了一种解决方案,可以通过使用一个对象来代表设备来保持表分裂。

这是映射配置:

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; }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章