Мне нужно сгенерировать значение при вставке в ядро 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("");