如果 ID 号是由 EF6 的 newid() InSqlserver 自动生成的,则无法在数据库中创建它

问题描述 投票:0回答:1

我在一个名为 [Id] 的表中创建了一个列,并将其类型设为 nvarchar(50),当通过 a 在数据库中添加新记录时,其值由 newid() 自动生成,它是字母和数字的混合(sql server managment) ,在我执行表之前,新数字不会出现。

问题不在这里,真正的问题是在EF6中新建记录时,没有指定identity值就无法添加记录,出现如下信息:

关键字段 'Id' 的值不能为 null。在“预订”类型上定义的关键字段需要非空值。

sqlserver 表的代码


CREATE TABLE [dbo].[TableName](
    [id] [varchar](10) NOT NULL,
    [Price] [nvarchar](10) NULL,
PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[TableName] ADD  DEFAULT (concat(left(newid(),(4)),'-',abs(checksum(newid()))%(10000))) FOR [id]
GO

在 Ef6 中使用代码

context Db = new context ();
t TableName = new TableName{
Price=10
};
db.TableName.add(t);
db.SaveChanges();
c# sql-server entity-framework-6 newid
1个回答
-1
投票

您可以使用 HasDefaultValueSql 在 C# 中创建默认值

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        modelBuilder.Entity<TableName>().Property(e => e.id).HasDefaultValueSql("concat(left(newid(),(4)),'-',abs(checksum(newid()))%(10000))");
     

    }

我的班级:

public class TableName
{
    [Key]
    public string id {set;get;}

    public string Price {set;get;}
}

我的数据库上下文:


public class myContext : DbContext
{
    public myContext()
    {
    }
     public DbSet<TableName> TableName => Set<TableName>();

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .LogTo(Console.WriteLine, (_, level) => level == LogLevel.Information)
            

    public myContext(DbContextOptions<myContext> options) : base(options)
    {
     
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TableName>().Property(e => e.id).HasDefaultValueSql("concat(left(newid(),(4)),'-',abs(checksum(newid()))%(10000))");  
    } 

}

添加表名

myContext Db = new myContext();

var TableName = new TableName
{
    Price = "10"
};
Db.TableName.Add(TableName);
Db.SaveChanges();



结果:

id 价格
F295-4725 10

我的包裹:

  • Microsoft.EntityFrameworkCore:版本:6.0.16
  • Microsoft.EntityFrameworkCore.Design:版本:6.0.16
  • Microsoft.EntityFrameworkCore.SqlServer:版本:6.0.16
  • Microsoft.EntityFrameworkCore.Tools:版本:6.0.16
  • 实体框架:6.4.4
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.