AUTOINCREMENT doesn't usually need to be used in SQLite.即使没有此关键字,也会自动生成ID。
但是,在使用Entity Framework Core(从2.1.3版开始)和SQLite时,整数主键被声明为AUTOINCREMENT。有办法避免这种情况吗?
我尝试将01:00:00pm
属性添加到实体的主键属性,但这完全禁用了自动键生成,因此我必须为每个插入手动设置它。否则,EFC尝试插入一个显式[DatabaseGenerated(DatabaseGeneratedOption.None)]
。
所以我需要将其视为插入时生成的数据库,我只是想避免不必要的AUTOINCREMENT关键字。有办法吗?
以下是一些C#代码示例:
Id = 0
使用DB Browser for SQLite进行查看时,这将创建一个如下所示的数据库:
我宁愿没有声明为AUTOINCREMENT的主键,它也会创建sqlite_sequence表。 SQLite可以生成没有该关键字的键,并且这样做更简单,更快捷。
答案 0 :(得分:2)
据我所知,问题是由当前SqliteMigrationsAnnotationProvider
类中的以下代码引起的:
if (property.ValueGenerated == ValueGenerated.OnAdd
&& property.ClrType.UnwrapNullableType().IsInteger()
&& !HasConverter(property))
{
yield return new Annotation(SqliteAnnotationNames.Autoincrement, true);
}
这将SqliteMigrationsSqlGenerator
类强制设置为include AUTOINCREMENT
。
我不知道为什么,我认为这是一个遗留的错误,但您最好在他们的问题跟踪器中询问。
看看代码,看起来好像设置了伪造的值转换器将防止这种情况发生,并且可以用作临时解决方法:
modelBuilder.Entity<Entity>()
.Property(e => e.Id)
.HasConversion(v => v, v => v);
答案 1 :(得分:0)
如下定义模型类。因此,您将不会映射ID列,而将另一列用作PK。
[NotMapped]
public override int Id
{
get
{
return PKColumn;
}
set
{
PKColumn = value;
}
}
[Key]
public virtual int PKColumn { get; set; }