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です。
私のモデルには、自動インクリメントとして提供されるプライマリキー整数型のエンティティがあります
問題は、問題のプロパティが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にします。
バグのように見えます。これを確認してください: https://github.com/aspnet/EntityFrameworkCore/issues/11961
私の回避策:DBContextクラスのId列で。ValueGeneratedNever()を。ValueGeneratedOnAdd()に手動で変更します。
テストに使用していた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")
の行をコメントアウトすると、エラーが修正されました。