SQL Server 2016およびEntity Frameworkコアを使用しています。SQL Server - 主キーとして連結された文字列 - EFコードによる挿入失敗
シーケンスに連結された文字列をテーブルの主キーとして使用したいとしましょう。
Iが正常コード・ファーストマイグレーションを使用してテーブルを作成して、所望の連結(SSMSからスクリーン)であることがカラムのデフォルト値を設定している:私は使用して手動でテーブルに行を挿入する場合
INSERTコマンドは、期待どおりに動作します。列の値を省略すると、シーケンスから生成されます。そうでなければ、提供された値が使用されます。私はコードでエンティティを挿入しようとすると、
しかし、 - 例外がスローされている
のSystem.InvalidOperationException:それは持っているので、エンティティ名 『「を作成またはタイプの実体を追跡できません』 nullのプライマリまたは代替キー値。
エンティティの関連フィールドは、単純な文字列プロパティです。私は[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
注釈を追加しようとしましたが、それは役に立たなかった。
編集:私はAdd (Sync)
スタックトレースを呼び出す -
Result StackTrace:
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NullableKeyIdentityMap`1.Add(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode node)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph(EntityEntryGraphNode node, Func`2 handleNode)
at Microsoft.EntityFrameworkCore.DbContext.SetEntityStates(IEnumerable`1 entities, EntityState entityState)
at Microsoft.EntityFrameworkCore.DbContext.AddRangeAsync(IEnumerable`1 entities, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.AddRangeAsync(IEnumerable`1 entities, CancellationToken cancellationToken)
at (Rest of the stack trace...)
任意の提案を -
Result StackTrace:
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NullableKeyIdentityMap`1.Add(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode node)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph(EntityEntryGraphNode node, Func`2 handleNode)
at Microsoft.EntityFrameworkCore.DbContext.SetEntityStates(IEnumerable`1 entities, EntityState entityState)
私はAddAsync
スタックトレースを呼び出しますか?ありがとう
どうやって追加していますか?つまり、db.Entity.Add'または 'db.Entity.AddAsync'を使用していますか? 「AddAsync'は必須です」...「Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo」で使用されているような特別な値ジェネレータが非同期的にデータベースにアクセスできるようにするには、 – Tseng
私は 'DBContext.Entity.AddRange'を使用します。非同期ではありません – DotnetProg
'AddRangeAsync'バリアントを使用して、サーバ側の値ジェネレータを使用する必要があるので、それがうまく機能するかどうかを確認してください。https://docs.microsoft.com/en-us/ef/core/ api/microsoft.entityframeworkcore.dbset-1#methods_ – Tseng