のための明示的な値を挿入しようと、私は次のクラスがあります。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値を挿入しようとしているのはなぜですか?
これはEFコア実装ミスかもしれませんが、私はアプローチを混ぜないことをお勧めします。 'myContext.Entry(エンティティ).State = EntityState.Added;または' myContext.ChangeTracker.TrackGraph(エンティティ、ノード=> node.Entry.State =!node.Entry.IsKeySet?EntityState.Added:EntityState.Unchanged ); ' –
「これはあなたのやる方法」ではありませんが、この[回答]を見てください(https://stackoverflow.com/questions/43721383/how-is-the-difference-between-add-or-delete-エンティティからのdbset-and-lo/43878589#43878589)を参照してください。 'myContext.MyEntities.Local.Add(entity)'は子プロパティを追加しない場合に役立ちます。 – Smit
@Smit実際には、 'Local.Add'は私が望むものとまったく同じように見えます。関連するエンティティは分離されたままですが、追加されたエンティティのID参照は 'SaveChanges'でDBに正しく保持されます。このタイプのシナリオに単に 'Local.Add'を使うだけで、大きな注意点があることは承知していますか?関連エンティティは分離されたままであるため、 'SaveChanges'の後のDbContextでは利用できませんが、私の場合は問題ありません。 – codestothestars