Entity Framework Core: ограничение того, что столбцы внешнего ключа равны друг другу - PullRequest
0 голосов
/ 01 февраля 2019

Я использую Entity Framework Core 2.2 для управления базой данных торгуемых валют на SQL Server.В модели есть две сущности.Первая - это Currency, которая указывает торговую валюту, а другая - CurrencyPair, которая указывает пару валют, которые можно обменять друг на друга.

public class Currency
{
    public ulong Id { get; set; }
    public string Name {get; set; }

    [NotMapped]
    public IEnumerable<CurrencyPair> Pairs
    {
        get { PairsAsBase?.Concat( PairsAsQuote ?? new CurrencyPair[0] ); }
    }

    public virtual IEnumerable<CurrencyPair> PairsAsBase { get; set; }
    public virtual IEnumerable<CurrencyPair> PairsAsQuote { get; set; }
}

public class CurrencyPair
{
    public ulong Id { get; set; }
    public string Name { get; set; }
    public ulong BaseCurrencyId { get; set; }
    public ulong QuoteCurrencyId { get; set; }

    public virtual Currency BaseCurrency { get; set; }
    public virtual Currency QuoteCurrency { get; set; }
}

Я бы хотелограничьте таблицу CurrencyPair, чтобы в строках не было одинаковых Currency для полей BaseCurrency и QuoteCurrency.То есть, если конкретная валюта имеет Id = 1, то валютная пара с указанием BaseCurrencyId = 1 и QuoteCurrencyId = 1 не будет разрешена.

Вот моя реализация DbContext.OnModelCreating:

protected override void OnModelCreating( ModelBuilder modelBuilder )
{
    modelBuilder.Entity<Currency>().HasKey(x => x.Id);
    modelBuilder.Entity<Currency>().HasAlternateKey(x => x.Name);
    modelBuilder.Entity<Currency>()
                .HasMany(x => x.PairsAsBase)
                .WithOne(x => x.BaseCurrency)
                .HasForeignKey(x => x.BaseCurrencyId);
    modelBuilder.Entity<Currency>()
                .HasMany(x => x.PairsAsQuote)
                .WithOne(x => x.QuoteCurrency)
                .HasForeignKey(x => x.QuoteCurrencyId);

    modelBuilder.Entity<CurrencyPair>().HasKey(x => x.Id);
    modelBuilder.Entity<CurrencyPair>()
                .HasOne(x => x.BaseCurrency)
                .WithMany(x => x.PairsAsBase)
                .HasForeignKey(x => x.BaseCurrencyId);
    modelBuilder.Entity<CurrencyPair>()
                .HasOne(x => x.QuoteCurrency)
                .WithMany(x => x.PairsAsQuote)
                .HasForeignKey(x => x.QuoteCurrencyId);
}

TL; DR : Как я могу убедиться, что два столбца внешнего ключа в таблице не ссылаются на один и тот же объект (используя Entity Framework Core 2.2)?

Ответы [ 2 ]

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

AFAIK, нет хорошего способа обеспечить соблюдение вашего правила в конструкторе моделей lvl.Следующим лучшим вариантом будет перехват команд SQL, которые могут генерировать ошибочные данные через контекст ef, но API еще недостаточно развит, чтобы сделать это простым вариантом.

По моему мнению, единственные опции, которые вы оставилине имеет никакого отношения к EF:

  • Ограничение: Примените правило в вашей схеме БД, например.через ограничение CHECK
  • Проверка: применение правила на уровне модели предметной области, например.перехватывая установки для обоих свойств в классе и проверяя их значения.
0 голосов
/ 01 февраля 2019

Пробовали ли вы глобальные фильтры запросов, это должно помочь вам защитить некоторые нежелательные сообщения, которые будут отображаться при запросе

modelBuilder.Entity<CurrencyPair>().HasQueryFilter(p => p.BaseCurrency != p.QuoteCurrency);

Данные по-прежнему будут храниться в вашей таблице, но не будут отображаться при ее использовании.

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