как реализовать многоуровневые ограничения с помощью EF - PullRequest
0 голосов
/ 01 февраля 2019

Допустим, у меня есть отношения Склад -> Корзина -> Деталь (форма, размер, цвет).Мы можем легко иметь уникальное индексное ограничение для части, которое позволило бы мне отмечать ошибку нарушения для более чем одной части одного цвета (например, только для одной "красной") на ячейку.Однако что, если я хотел бы иметь ограничение, которое позволяло бы мне иметь только одну такую ​​деталь на склад?Как я могу сделать это в EF?

1 Ответ

0 голосов
/ 04 февраля 2019

Итак, классы сущностей вашего домена будут выглядеть примерно так:

public enum ColorEnum : byte
{
    Red = 1,
    Blue = 2
}

public class Part
{
    public long Id { get; private set; }

    public ColorEnum Color { get; private set; }

    public Bin Bin { get; private set; }
    public int BinId { get; private set; }
}

public class Bin
{
    public int Id { get; private set; }

    public Warehouse Warehouse { get; private set; }
    public short WarehouseId { get; private set; }

    public ICollection<Part> Parts { get; private set; }
}

public class Warehouse
{
    public short Id { get; private set; }

    public ICollection<Bin> Bins { get; private set; }
}

Поскольку вы хотите, чтобы ваши детали теперь имели уникальный цвет для каждого склада, теперь им необходимо знать об их складе.Поэтому добавьте ссылку на Склад внутри класса Part:

public class Part
{
    public long Id { get; private set; }

    public ColorEnum Color { get; private set; }

    public Bin Bin { get; private set; }
    public int BinId { get; private set; }

    public Warehouse Warehouse { get; private set; }
    public short WarehouseId { get; private set; }
}

Теперь мы хотим создать уникальный индекс для класса Part для: (WarehouseId, Color).

Мы можем достичь этогодвумя способами:

1) Добавляя аннотации к свойствам вашей сущности (из пространства имен System.ComponentModel.DataAnnotations.Schema):

public class Part
{
    public long Id { get; private set; }

    [Index("UX_Warehouse_Color", 2, IsUnique = true)]
    public ColorEnum Color { get; private set; }

    public Bin Bin { get; private set; }
    public int BinId { get; private set; }

    public Warehouse Warehouse { get; private set; }
    [Index("UX_Warehouse_Color", 1, IsUnique = true)]
    public short WarehouseId { get; private set; }
}

2) Используя свободный API EntityFramework внутри нашего DbContextреализация класса в переопределении для метода protected virtual void DbContext.OnModelCreating(DbModelBuilder modelBuilder);:

modelBuilder.Entity<Part>()
    .HasIndex(part => new { part.WarehouseId, part.Color })
    .IsUnique();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...