Entity Framework, как избежать этой проблемы? - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть такой метод:

    public FbUser FindUserByGraphOrInsert(dynamic json, bool commit = false)
    {
        string graphId = json.id;

        EntityDataModelContext context = DataContext.GetDataContext();
        FbUser user = context.FbUsers.FirstOrDefault(u => u.FbGraphId == graphId);

        if (user == null)
        {
            user = new FbUser();
            user.FbGraphId = json.id;
            user.FbUsername = StringExtensions.UnicodeDecode(json.name);

            context.FbUsers.AddObject(user);

            if (commit)
                context.SaveChanges();
        }

        return user;
    }

Я вызываю этот метод несколько раз в цикле (скажем, в 80 раз), с commit = false

Дело в том, что я ожидалэтот метод, чтобы сообщить мне, если пользователь уже находится в контексте, но это не так.

В результате, когда я, наконец, сохраняю изменения, я получаю список из 80 пользователей,где 27 различны.

Я ожидаю, что этот метод возвратит эти 27, как я могу изменить его, чтобы добиться этого?
Действительно ли мне нужно сохранять изменения каждый раз?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Вы не можете «просто» сделать это, проблема в том, что каждый запрос всегда будет попадать в базу данных по умолчанию, так как EF не может знать, что вы запрашиваете одни и те же данные или что в базе данных не было изменений, лежащих в основе, так как вы открыл соединение.

Тем не менее, вы можете проверить ChangeTracker / ObjectStateManager на наличие существующих измененных объектов и запросить их, прежде чем принять решение о добавлении нового объекта.

Образец:

var addedObjects = context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added);
var equalObjects = addedObjects.OfType<MyEntity>().Where(x => x.Name == newObject.Name);
0 голосов
/ 08 ноября 2011

Основываясь на ответе Полити, я реализовал следующий метод расширения, который сработал.

    public static IEnumerable<T> IncludeUnsaved<T>(this ObjectSet<T> set) where T : class
    {
        var addedObjects = set.Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added);
        var equalObjects = addedObjects.Select(e => e.Entity).OfType<T>();

        return equalObjects.Concat(set);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...