3

監査ログの目的SaveChanges()で、EF4.1データベースのメソッドをオーバーライドします-最初のアプローチ。

私はすべてのObjectStateEntryオブジェクトを持っていますが、各ObjectStateEntryからすべてのキーとその値を取得できるかどうか疑問に思っています。

   IEnumerable<ObjectStateEntry> changes = this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified);
    foreach (ObjectStateEntry stateEntryEntity in changes)
    {
        if (!stateEntryEntity.IsRelationship &&
                stateEntryEntity.Entity != null &&
                    !(stateEntryEntity.Entity is DBAudit))
        {
          list<object , object> KeyValues = GetAllKeyValues(stateEntryEntity );
          //Do log all keyvalues
        }
    }
4

3 に答える 3

7

私はそれをテストしていませんが、このようなものが機能するはずです:

private Dictionary<string, object> GetAllKeyValues(ObjectStateEntry entry)
{
    var keyValues = new Dictionary<string, object>();
    var currentValues = entry.CurrentValues;
    for (int i = 0; i < currentValues.FieldCount; i++)
    {
        keyValues.Add(currentValues.GetName(i), currentValues.GetValue(i));
    }
    return keyValues;
}
于 2012-01-16T06:38:57.990 に答える
3

ObjectStateEntry.EntityKeyを使用してみてくださいEntityKey.EntityKeyValues

var keyValues = stateEntityEntry.EntityKey.EntityKeyValues;

これは、 EntityKeyMemberの配列を返します。Key次に、とValueプロパティを使用できます。これらはそれぞれstringとを返しobjectます。

于 2012-01-16T06:53:44.353 に答える
0

これが拡張メソッドの形での私の解決策です。

public static class ExtensionMethods
{
    public static IReadOnlyDictionary<string, object> GetKeyValues(this ObjectStateEntry instance)
    {
        var keyMemberNames = instance
            .EntitySet
            .ElementType
            .KeyMembers
            .Select(x => x.Name)
            .ToList();

        var currentValues = instance.CurrentValues;
        var result = new Dictionary<string, object>();
        for (var i = 0; i < currentValues.FieldCount; i++)
        {
            var name = currentValues.GetName(i);
            if (!keyMemberNames.Contains(name))
                continue;

            var value = currentValues.GetValue(i);
            result.Add(name, value);
        }

        return result;
    }

    public static IReadOnlyDictionary<string, object> GetValues(this ObjectStateEntry instance)
    {
        var currentValues = instance.CurrentValues;
        var result = new Dictionary<string, object>();
        for (var i = 0; i < currentValues.FieldCount; i++)
        {
            var name = currentValues.GetName(i);
            var value = currentValues.GetValue(i);
            result.Add(name, value);
        }

        return result;
    }
}
于 2021-11-03T13:36:21.253 に答える