我在一个名为 [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();
您可以使用 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 |
我的包裹: