Asp.net 如何在实体框架核心中使用VARCHAR或NVARCHAR自动递增Id?

Asp.net 如何在实体框架核心中使用VARCHAR或NVARCHAR自动递增Id?,asp.net,entity-framework,asp.net-core,entity-framework-6,Asp.net,Entity Framework,Asp.net Core,Entity Framework 6,以前我在SQL代码中使用复合列来实现这一点 [ID] [int] IDENTITY(1,1) NOT NULL, [PreFix] [varchar](50) NOT NULL, [EmployeeNo] AS ([PreFix]+ RIGHT('0000000' + CAST(Id AS VARCHAR(7)), 7)) PERSISTED, 主要有不同的解决方法,最简单的方法是修改OnModelCreating方法,在计算列上使用一个fluent API函数hascutedcolumns

以前我在SQL代码中使用复合列来实现这一点

[ID] [int] IDENTITY(1,1) NOT NULL,
[PreFix] [varchar](50) NOT NULL,
[EmployeeNo]  AS ([PreFix]+ RIGHT('0000000' + CAST(Id AS VARCHAR(7)), 7)) PERSISTED,

主要有不同的解决方法,最简单的方法是修改
OnModelCreating
方法,在计算列上使用一个fluent API函数
hascutedcolumnsql

代码优先方法

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Employee>()
    .Property(e => e.EmployeeNo)
    .HasComputedColumnSql("[PreFix]+ RIGHT('0000000' + CAST(Id AS VARCHAR(7)), 7)");
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.Property(e=>e.EmployeeNo)
.HasComputedColumnSql(“[前缀]+右('0000000'+强制转换(Id为VARCHAR(7)),7)”);
}
数据库优先方法

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Employee>()
    .Property(e => e.EmployeeNo)
    .HasComputedColumnSql("[PreFix]+ RIGHT('0000000' + CAST(Id AS VARCHAR(7)), 7)");
}
对于数据库优先的方法,您仍然可以在创建表时定义计算逻辑,并在实体框架核心的上下文端使用以下修改

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Contact>()
            .Property(p => p.EmployeeNo)
            .ValueGeneratedOnAdd();
    }
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.Property(p=>p.EmployeeNo)
.ValueGeneratedOnAdd();
}

我想在应用程序层无法可靠地执行此操作,因为您无法保证您的新ID尚未被其他人的应用程序使用。您是否考虑过使用GUID?或者,如果在您的情况下,您不能使用GUID,我可以编写一个简单的解决方案。在我的情况下,我不需要GUID。我想在ID前面加上一些字符,比如EM之类的。