如何在EFC和SQLite中避免使用AUTOINCREMENT关键字?

时间:2018-09-24 09:59:44

标签: c# .net sqlite .net-core entity-framework-core

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进行查看时,这将创建一个如下所示的数据库:

enter image description here

我宁愿没有声明为AUTOINCREMENT的主键,它也会创建sqlite_sequence表。 SQLite可以生成没有该关键字的键,并且这样做更简单,更快捷。

2 个答案:

答案 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; }