【问题标题】:Multiple autogenerated values at an entity实体上的多个自动生成的值
【发布时间】:2021-12-22 18:35:39
【问题描述】:

我正在使用 aspnetcore 和 mysql,使用实体框架,但我不知道如何通过数据库设置多个自动生成的值。我想将此应用于 Id 和 InvoiceNo 字段。这是我的代码...

[Table("Invoices")]
    public class Invoice : IEntity
    {
        private double _tax;
        private double _total;
        [Key] public int Id { get; set; }

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int InvoiceNo { get; set; }
        public double Subtotal { get; set; }
        public double VatRate { get; set; }

        public double Tax
        {
            get => _tax;
            set => _tax = Subtotal * (VatRate / 100);
        }
        public double Total
        {
            get => _total;
            set => _total = Subtotal + _tax;
        }

        public DateTime CreatedOn { get; set; }
        public Status Status { get; set; }
        public string UpdatedBy { set; get; }

        public static void RegisterMap(IMapperConfigurationExpression c)
        {
            c.CreateMap<Invoice, InvoicePageDTO>().ReverseMap();
        }
    }

【问题讨论】:

  • 嗨 Evelio Vega,有更新吗?如果我的回答能帮助您解决问题,您能接受吗?如果没有,你能跟进让我知道吗?参考:How to access an answerThanks.

标签: c# mysql entity-framework asp.net-core


【解决方案1】:

根据 MySQL 8.0 参考手册:每个表只能有一个 AUTO_INCREMENT 列。 链接:https://dev.mysql.com/doc/refman/8.0/en/create-table.html

因此,您不能在一个表中设置多个 AUTO_INCREMENT 列。 但是您可以通过某些方式设置多个自动生成的值。下面提供了一个适合SQL Sever的解决方案,大家可以参考。 数据库设置多个自动生成的值,其中一个通过设置key(AUTO_INCREMENT列)实现增量,另一个通过插入数据库的自增代码实现。

演示如下:

1.首先在数据库中找到InvoiceNo的最大值,自动递增。

Invoice.cs:

public class Invoice
    {
        private readonly EF6Context  _context;      
        public Invoice(EF6Context context)
         {
                _context = context;
                var maxvalue = _context.Invoice.OrderByDescending(c => c.InvoiceNo).Select(c => c.InvoiceNo).FirstOrDefault();
                var defaultminvalue = 25;
                var increase = 2;
                this.InvoiceNo = maxvalue == 0 ? defaultminvalue : maxvalue + increase;
         }
           public int Id { get; set; }        
           public int InvoiceNo { get; set; }
           public string name { get; set; }
    }

2.然后将值插入数据库。

InvoicesController.cs:

 public class InvoicesController : Controller

    {
       
        private readonly EF6Context _context;

        public InvoicesController(EF6Context context)
        {
            _context = context;

        }

        // GET: Invoices
        public async Task<IActionResult> Index()
        {
            var invoice = new Invoice(_context) { name = "vv" };
            _context.Invoice.Add(invoice);
            _context.SaveChanges();
            var result = await _context.Invoice.ToListAsync();
            return View(result);
        }
}

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2018-08-23
    相关资源
    最近更新 更多