我正在尝试为具有复杂值对象的实体建模。
数据库结构可能类似于以下内容:
+-------------------------------------+
| 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] 删除。
我来说两句