web-dev-qa-db-ja.com

EFコアを使用してSQLiteで自動インクリメント列を作成する方法は?

WPおよび.NET Standard アプリで、最初にSqliteコードにEntity Framework Core 2.0を使用しています。私のモデルには、プライマリキー整数型のエンティティがあります。このエンティティは、 SQLiteドキュメント に従って自動インクリメントとして提供される必要があります。しかし、実際には、ID列が値として0を取得しているすべての行に対して。この問題に関連する資料は見つかりませんでしたので、ご協力ください。

これは、データ注釈のない私の財産です。

_public Int32 No { get; set; }_

Fluent APIを使用しました

_modelBuilder.Entity<TurnosGeneral>()
            .HasKey(c => new { c.No, c.Cod_Turno });
_

ここに値が挿入されます

_db.TurnosGenerals.Add(new TurnosGeneral { Cod_Turno = numeroTurnoTextBlock.Text });
_

db.SaveChanges();

挿入されたすべての行に対してc.Noは0です。

12
Zubair Rana

私のモデルには、自動インクリメントとして提供されるプライマリキー整数型のエンティティがあります

問題は、問題のプロパティがnot PKであるが、複合の一部 PKであるということです。この場合、慣例により自動生成とは見なされません。 EF Coreドキュメントの Generated Values Conventions セクション:

慣例により、non-compositeタイプshort、int、long、またはGuidの主キーは、追加時に値が生成されるように設定されます。他のすべてのプロパティは、値生成なしでセットアップされます。

以下を明示的に指定する必要があります。

modelBuilder.Entity<TurnosGeneral>()
    .Property(e => e.No)
    .ValueGeneratedOnAdd();

更新:上記は、ほとんどのデータベースに適用可能な一般的なアプローチです。ただし、SQLiteはAutoIncrementをサポートしています INTEGER PRIMARY KEYタイプの列のみ 。したがって、これはEF Coreの制限ではありません。自動インクリメントを使用しないか、非合成PKにします。

15
Ivan Stoev

バグのように見えます。これを確認してください: https://github.com/aspnet/EntityFrameworkCore/issues/11961

私の回避策:DBContextクラスのId列で。ValueGeneratedNever()。ValueGeneratedOnAdd()に手動で変更します。

2
Prodromos

テストに使用していたSQLite in memoryデータベースでこれに遭遇しました。私の場合、ContactCategoryIdという主キーフィールドを持つビジネスクラスがありました。

_public class ContactCategory
{
    [Required]
    [Display(Name = "Contact category ID")]
    public int ContactCategoryId { get; set; }
_

また、設定には流forなアプローチを使用していました。

_public void Configure(EntityTypeBuilder<ContactCategory> modelBuilder)
{
    modelBuilder.ToTable("CONTACT_CATEGORY", _schema);

    modelBuilder.HasKey(x => x.ContactCategoryId);

    modelBuilder.Property(x => x.ContactCategoryId)
        .HasColumnName(@"ContactCategoryID")
        //.HasColumnType("int") Weirdly this was upsetting SQLite
        .IsRequired()
        .ValueGeneratedOnAdd()
        ;
_

.HasColumnType("int")の行をコメントアウトすると、エラーが修正されました。

1
tomRedox