Генерация значения SQL на основе других строк при вставке с помощью ядра Entity Framework - PullRequest
0 голосов
/ 06 мая 2020

Мне нужно сгенерировать значение при вставке в ядро ​​Entity Framework. Это значение основано на других значениях в указанной таблице. В настоящее время я делаю это в C#, но я бы предпочел, чтобы это происходило на стороне SQL, поскольку это будет более устойчиво к нескольким одновременным торгам.

Сценарий - это сайт для аукционов. Я хочу дать каждому участнику аукциона номер участника аукциона. Эти номера участников торгов начинаются с 1 для каждого аукциона.

Итак, когда Пользователь 1 делает ставку на аукционе A, он получает номер участника торгов 1, вставленный в столбец [BidderNumber]. Когда другой пользователь делает ставку на аукционе A, он получает 2, вставленные в [BidderNumber]. Если один из этих людей затем go и делает ставку на другом аукционе, этот номер участника снова генерируется для этих ставок на основе того, сколько людей уже сделали ставки на этих c аукционах.

В настоящее время моя таблица ставок выглядит так.

[Table("Bids", Schema = "auction")]
public class AuctionBid 
{
    public long Id { get; set; }

    public virtual Auction Auction { get; set; }
    public ApplicationUser User { get; set; }

    public int BidderNumber { get; set; }

    [Column(TypeName = "decimal(18,2)")]
    public decimal Value { get; set; }
}

Прямо сейчас я получаю BidderNumber с кодом перед тем, как вставлять новую ставку.

private async Task<int> GetBidderNumber(int auctionId, string userId)
{
    var bidUsers = await _context.Bids
        .Include(b => b.Auction)
        .Include(b => b.User)
        .Where(b => b.Auction.Id == auctionId)
        .Select(b => new
        {
            UserId = b.User.Id,
            BidderNumber = b.BidderNumber
        })
        .Distinct()
        .ToListAsync();

    var thisUser = bidUsers.FirstOrDefault(bu => bu.UserId == userId);

    if (bidUsers.Any() == false)
    {
        return 1;
    }
    else if (thisUser != null)
    {
        return thisUser.BidderNumber;
    }
    else
    {
        return bidUsers.Max(bu => bu.BidderNumber) + 1;
    }
}

Итак, есть ли способ написать это с помощью api ядра фреймворка fluent entity framework, чтобы вместо этого это выполнялось на сервере SQL?

Я предполагаю, что буду использовать это каким-то образом, но я не могу понять как.

builder.Entity<AuctionBid>()
    .Property(p => p.BidderNumber)
    .HasDefaultValueSql("");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...