Допустим, у меня есть Продукт A, который в целом стоит 10, но для Клиента X он стоит 8. Я хочу сохранить эту информацию в Цене таблица / класс (так как существуют другие общие свойства и методы).
Когда "ClientId" равен нулю, это означает, что у меня есть цена по умолчанию для "ProductId", в противном случае это цена, специфичная для этого "ClientId".
Итак, я настроил следующие объекты:
// owned type
public class Price
{
public Guid Id { get; private set; }
public Guid ProductId { get; private set; }
public Guid? ClientId { get; private set; }
public decimal Value { get; private set; }
// ... some other properties and methods
}
// 1st owner
public class Product
{
public Guid Id { get; private set; }
public List<Price> Prices { get; private set; }
// ...
}
// 2nd owner
public class Client
{
public Guid Id { get; private set; }
public List<Price> Prices { get; private set; }
// ...
}
И их сопоставления:
// 1st owner mappings
public class ProductMap : EntityMappings<Product>
{
public override void Configure(EntityTypeBuilder<Product> entity)
{
base.Configure(entity);
entity.ToTable("product");
entity.Property(e => e.Id).HasColumnName("id").HasColumnType("uuid").ValueGeneratedNever();
// this part is identical for both owners
entity.OwnsMany(e => e.Prices, child =>
{
child.ToTable("price");
child.Property(e => e.Id).HasColumnName("id").HasColumnType("uuid").ValueGeneratedNever();
child.Property(e => e.Value).HasColumnName("value").HasColumnType("numeric(10,2)");
child.Property(e => e.ProductId).HasColumnName("product_id").HasColumnType("uuid");
child.Property(e => e.ClientId).HasColumnName("client_id").HasColumnType("uuid");
child.HasKey(e => e.Id).HasName("pk-price");
child.HasForeignKey(e => e.ProductId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk-price-product");
child.HasForeignKey(e => e.ClientId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk-price-client");
});
entity.HasKey(e => e.Id).HasName("pk-product");
}
}
// 2nd owner mappings
public class ClientMap : EntityMappings<Client>
{
public override void Configure(EntityTypeBuilder<Client> entity)
{
base.Configure(entity);
entity.ToTable("client");
entity.Property(e => e.Id).HasColumnName("id").HasColumnType("uuid").ValueGeneratedNever();
// this part is identical for both owners
entity.OwnsMany(e => e.Prices, child =>
{
child.ToTable("price");
child.Property(e => e.Id).HasColumnName("id").HasColumnType("uuid").ValueGeneratedNever();
child.Property(e => e.Value).HasColumnName("value").HasColumnType("numeric(10,2)");
child.Property(e => e.ProductId).HasColumnName("product_id").HasColumnType("uuid");
child.Property(e => e.ClientId).HasColumnName("client_id").HasColumnType("uuid");
child.HasKey(e => e.Id).HasName("pk-price");
child.HasForeignKey(e => e.ProductId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk-price-product");
child.HasForeignKey(e => e.ClientId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk-price-client");
});
entity.HasKey(e => e.Id).HasName("pk-client");
}
}
Это дает мне ошибку
Невозможно использовать таблицу «цена» для типа сущности «Client.Prices # Price», поскольку она используется для типа сущности «Product.Prices # Price», и между их первичными ключами нет взаимосвязи.
Но я не знаю, как соотнести их ПК, поскольку они являются одной и той же сущностью / классом с обеих сторон.
Есть ли способ сделать это?Или предложения по лучшему подходу, чтобы избежать дублирования поведения (и структуры таблицы), найденного в Price entity?