Возможно ли иметь один тип, принадлежащий двум разным владельцам в EF Core? - PullRequest
0 голосов
/ 15 апреля 2019

Допустим, у меня есть Продукт 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...