する必要がある
いくつかのエンティティをメモリにロードし、
その「スカラー」のカップルを変更します
プロパティ値 - そのナビゲーション プロパティに触れずに。と
それらを新しいエンティティとして Db に保存します。
オブジェクトのIDをNULLに設定して新しいエンティティとして保存するだけで十分ですか、それともトリックは何ですか?
する必要がある
いくつかのエンティティをメモリにロードし、
その「スカラー」のカップルを変更します
プロパティ値 - そのナビゲーション プロパティに触れずに。と
それらを新しいエンティティとして Db に保存します。
オブジェクトのIDをNULLに設定して新しいエンティティとして保存するだけで十分ですか、それともトリックは何ですか?
エンティティの状態を変更済みから追加済みに変更するだけで、Entity Framework は更新ではなく挿入を実行します。
DbContext API を使用した例:
DbContext context = // ...
foreach (var entityEntry in context.ChangeTracker.Entries())
{
if (entityEntry.State == EntityState.Modified)
entityEntry.State = EntityState.Added;
}
ct.SaveChanges();
Automapper を使用してオブジェクトを複製し、いくつかのプロパティを変更して、これを新しいエンティティとして保存できます。
例えば:
//Get the source object from a fictitious repository
Person source = PersonRepository.GetPersonByID(555);
//Create an AutoMapper Mapper
Mapper.CreateMap<Person, Person>();
//If you want to ignore the primary key of the original object, use something like this:
//Mapper.CreateMap<Person, Person>().ForMember(x => x.PersonID, y => y.Ignore());
//Clone your source person
var clone = Mapper.Map<Person>(source);
//Set some property
clone.SomeProperty = 123;
//Save our clone against the fictional repository
PersonRepository.Save(clone);
//You could also return your clone at this point...
先日、このアプローチを使用してレコードを複製しました。実行できる便利な方法の 1 つは、識別されたソース (たとえば ) を取得し、source.PersonID
これに対して保存しclone.ParentID
て、クローンの元を見つけることができるようにすることです (必要に応じて、先に進んでこれを外部キーにすることもできます)。
ソース/推奨読書 -オブジェクトをオブジェクトにコピーします (Automapper を使用しますか?)
必要に応じて、新しいエンティティ タイプにマップすることもできます - Automapper wiki を参照してください - https://github.com/AutoMapper/AutoMapper/wiki/Getting-started
エンティティが一意である必要があり、エンティティを変更すると新しいエンティティが生成されるプロジェクトでも、これと同じ困難がありました。エンティティを取得して同じ型を返すエンティティ クラスに Clone メソッドを作成しました。新しいインスタンスを作成し、関連するすべてのプロパティをコピーしてから、新しいエンティティを返します。
これをさらに進めるには、リフレクションを使用してプロパティ値をコピーし、そこからエンティティを継承させる Clone メソッドを使用して基本クラスを作成できます。
Entity Framework の使用方法に応じて、エンティティをデタッチおよびアタッチし、スカラー値 (ID を含む) を変更して、「追加済み」としてマークできると思います。外部エンティティを接続/追加する必要がある場合があります。私が話していることの詳細については、このページを参照してください。