Копирование класса из DataContext вызывает загрузку кэшированных данных при следующем вызове базы данных в Entity Framework? - PullRequest
0 голосов
/ 28 августа 2009

У меня есть два класса; Площадь и LanguageArea . Я использую LanguageArea для обработки переведенных областей.

Area.cs
Заголовок строки,
Описание строки,
Картинки (набор класса Picture),
LanguageAreas (набор класса LanguageArea)

LanguageArea.cs
Язык (определяет, на какую языковую область переводится),
Площадь,
Заголовок (перевод заглавия Района),
Описание (переведенное описание для области)

Например, когда переведенная область запрашивается из пользовательского интерфейса, сначала я получаю LanguageArea

public Area GetByLanguageId(long areaId, byte LanguageId)
        {
            var langArea = db.LanguageArea
                            .Where(i => i.Area.id == areaId && i.Language.id ==  LanguageId).FirstOrDefault();
            Area newArea = null;    
            if (langArea != null && langArea.Area != null)
            {
              newArea = langArea.Area; // I have copied to area to get area with pictures in it
              newArea.Title = langArea.Title; // I got the translated Title
              newArea.Description = langArea.Description; // I got the translated description
            }    
            return newArea;
        }  

С помощью метода, описанного выше, я получаю объект всей области с переведенным названием и описанием . Но переведенный заголовок и описание сохранены в ObjectContext. После этого, когда язык по умолчанию или любой другой язык запрашивал пользовательский интерфейс, он по-прежнему получал переведенный заголовок и описание из ObjectContext, а не данные из БД.

Я пытался MergeOption.OverwriteChanges. На этот раз все было в порядке, но при сохранении он сохранил переведенную информацию, а не оригинальную, которая находится в БД.

Я пытался Context.Refresh();, но это выглядит как временное решение.

Что вы порекомендуете для решения этой ситуации?

Спасибо

Ответы [ 2 ]

1 голос
/ 28 августа 2009

Когда вы получаете объект языковой области, он отслеживается ObjectContext. Таким образом, объект Area, который вы передаете newArea, также отслеживается. Как я понимаю, вы используете объект Area только в целях презентации и не хотите, чтобы изменения были сохранены.

Если это так, вызов метода Detach для ObjectContext перед возвратом объекта newArea может решить проблему, поскольку ObjectContext остановит отслеживание объекта Area и изменения не будут сохранены.

db.Detach(newArea); return newArea; 
0 голосов
/ 28 августа 2009

Я сделал это. После db.Detach(newArea); для картинок я записал эти строки

.
.
.
db.Detach(a);
var pics = db.Picture.Where(p => p.Area.id == a.id).AsEnumerable()
                     .Select(p => new Picture() 
           {IsProfile = p.IsProfile, id = p.id, Path = p.Path, Title = p.Title});
if (pics.Count()>0)
    foreach (var pic in pics)
       a.Pictures.Add(pic);

return a;

Надеюсь, это поможет кому-то еще

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...