Entity Framework 4.1 Code First を使用しています。エンティティがデータベースから読み込まれてから変更されたプロパティのリストを取得する組み込みの方法はありますか? オブジェクトが変更されたことをコードが最初に検出することは知っていますが、変更されたプロパティを正確に取得する方法はありますか?
1 に答える
スカラーおよび複雑なプロパティの場合、以下を使用して、エンティティの変更されたプロパティ名を抽出できますmyEntity
。
var entry = context.Entry(myEntity);
var namesOfChangedProperties = entry.CurrentValues.PropertyNames
.Where(p => entry.Property(p).IsModified);
ここで注意すべき点がいくつかあります。
CurrentValues.PropertyNames
ナビゲーションプロパティではなく、スカラープロパティと複雑なプロパティのみが含まれます。複合プロパティとは、エンティティで宣言されている複合プロパティの名前のみを意味し、複合タイプ自体の実際の個々のプロパティは意味しません。例:このモデルがある場合...
[ComplexType] public class Address { public string Country { get; set; } public string City { get; set; } } public class Person { public int Id { get; set; } public string Name { get; set; } public Address Address { get; set; } }
...次に、が
myEntity
の場合Person
、 「 Id」、「Name」、「AddressCurrentValues.PropertyNames
」は含まれますが、「Address.Country」または「Address.City」(または「Country」または「City」)は含まれません。複合プロパティが変更済みとしてマークされている場合(
.IsModified
上記のコードでは)、これは、複合型内のプロパティ値(および)が実際に変更されたかどうかに関係なくtrue
、参照(上記の例)のいずれかが変更されたことを意味します。または、複合型のプロパティのいずれかが変更された(または変更された)こと。EFは、1つのプロパティのみが変更され、もう1つのプロパティは変更されていない場合でも、すべての複合型プロパティに対して常にUPDATEコマンドをデータベースに送信するため、どれを見つけることはできないと思います。このことから、EFは個々の複合型プロパティの変更を追跡しないと結論付けます。Person.Address
Country
City
Country
City