2017-05-24 7 views
2

のための明示的な値を挿入しようと、私は次のクラスがあります。DbSet.Attachが生成されたID列

public class MyEntity 
{ 
    public int Id { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public MyContext(DbContextOptions<MyContext> options) : base(options) { } 

    public DbSet<MyEntity> MyEntities { get; set; } 
} 

はその後、別のクラスで、私は次のことを実行しています:

var entity = new MyEntity(); 

myContext.MyEntities.Attach(entity).State = EntityState.Added; 

myContext.SaveChanges(); 

SaveChangesメソッドの呼び出しを

IDENTITY_INSERTがOに設定されている場合、テーブルMyEntityの識別列に明示的な値を挿入できませんFF

この時点で、私のスキーマは完全に慣例によって作成されており、Id列は自動生成されると考えられています。問題は私がAttachを使用し、EntityState.Addedを手動で設定することと関係があるようです。代わりにAddを使用してください。

myContext.MyEntities.Add(entity); 

これはうまく動作します。しかし、Attachを使用したいのですが、私の実際のシナリオでは、MyEntityには、データベースに既に存在する追跡されていない子プロパティがあるためです。 Addは、関連する未追跡のエンティティの状態を自動的にEntityState.Addedに設定します。これらの既存のエンティティの状態を手作業でEntityState.Unchangedに設定する必要はありません。

私はここで何が欠けていますか?エンティティを接続して状態をAddedに設定した後でも、EFが明示的なID値を挿入しようとしているのはなぜですか?

+0

これはEFコア実装ミスかもしれませんが、私はアプローチを混ぜないことをお勧めします。 'myContext.Entry(エンティティ).State = EntityState.Added;または' myContext.ChangeTracker.TrackGraph(エンティティ、ノード=> node.Entry.State =!node.Entry.IsKeySet?EntityState.Added:EntityState.Unchanged ); ' –

+0

「これはあなたのやる方法」ではありませんが、この[回答]を見てください(https://stackoverflow.com/questions/43721383/how-is-the-difference-between-add-or-delete-エンティティからのdbset-and-lo/43878589#43878589)を参照してください。 'myContext.MyEntities.Local.Add(entity)'は子プロパティを追加しない場合に役立ちます。 – Smit

+0

@Smit実際には、 'Local.Add'は私が望むものとまったく同じように見えます。関連するエンティティは分離されたままですが、追加されたエンティティのID参照は 'SaveChanges'でDBに正しく保持されます。このタイプのシナリオに単に 'Local.Add'を使うだけで、大きな注意点があることは承知していますか?関連エンティティは分離されたままであるため、 'SaveChanges'の後のDbContextでは利用できませんが、私の場合は問題ありません。 – codestothestars

答えて

1

これはEFの設計上の動作です。 Add()を呼び出すと、オブジェクトがデータベースに存在しないため、そのエンティティに対してキーが生成されます。 Attach()を呼び出すと、db内に存在することを意味します。したがって、後で追加するように状態を設定しても、キーの生成は実行されません。

+0

ありがとうございます。 Attach()の後にIDを生成するようにEFに指示する方法を知っていますか、またはAdd()にAddedとして追加された関連するEntitiesを__not__しますか?追加された関連エンティティのマーキングは、私が避けようとしているものなので、手動でUnchangedに設定する必要はありません。 – codestothestars

+0

@ X-Malleus私が知っている唯一の方法はあなたが言いました:状態をUnchangedまたはDetachedに設定することです。この問題を解決する第三者図書館がいくつかありますが、それは決して私にとって問題ではありませんでした。 –

関連する問題