1

SQL Server 2016およびEntity Frameworkコアを使用しています。SQL Server - 主キーとして連結された文字列 - EFコードによる挿入失敗

シーケンスに連結された文字列をテーブルの主キーとして使用したいとしましょう。
Iが正常コード・ファーストマイグレーションを使用してテーブルを作成して、所望の連結(SSMSからスクリーン)であることがカラムのデフォルト値を設定している:私は使用して手動でテーブルに行を挿入する場合 enter image description here

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スタックトレースを呼び出しますか?ありがとう

+0

どうやって追加していますか?つまり、db.Entity.Add'または 'db.Entity.AddAsync'を使用していますか? 「AddAsync'は必須です」...「Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo」で使用されているような特別な値ジェネレータが非同期的にデータベースにアクセスできるようにするには、 – Tseng

+0

私は 'DBContext.Entity.AddRange'を使用します。非同期ではありません – DotnetProg

+0

'AddRangeAsync'バリアントを使用して、サーバ側の値ジェネレータを使用する必要があるので、それがうまく機能するかどうかを確認してください。https://docs.microsoft.com/en-us/ef/core/ api/microsoft.entityframeworkcore.dbset-1#methods_ – Tseng

答えて

0

私は考えていませんComputedあなたが欲しいもの - 計算された値は、物理的にサーバーに格納されていないことを意味し、クエリを実行するたびに計算される仮想プロパティですが、 。

何が欲しいのはIdentity元である:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

あなたがここにオプションの詳細を読むことができます:https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.databasegeneratedoption(v=vs.110).aspx

+0

IDは数値キー用ですが、文字列型キーが必要です – DotnetProg

+0

@DotnetProg:IDはデータ型(intまたはstring)を気にしません。 Dどちらの場合でもキーを計算するには、efault value SQLを使用します。 – caesay

+0

私の問題は、Identityが提供されているデフォルト値を無視するということです。つまり、このスレッドの全体的なポイントです... – DotnetProg

0

あなたがアイデンティティにStoreGeneratedPattern値を設定しようとすることができます。私はデータベースファーストのアプローチを使用しており、このプロパティを設定することで多くの助けになりました。

+0

IDは数値キー用です。文字列型キーが必要です – DotnetProg

+0

'[Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] 公開ストリングFooId {get;セット; } ' 私はこのリンクでこの解決策を見つけました:http://stackoverflow.com/a/32983614/3678882 – Tunahan

+1

私は事前にキーを入力してもうまくいきました。私はキーが私が提供したデフォルト値関数を使用するようにしたい。 – DotnetProg

関連する問題