Entity Framework: есть ли способ проверить, есть ли у контекста объект? - PullRequest
2 голосов
/ 24 марта 2009

Ситуация: объект в сеансе из прошлого контекста не может быть установлен как родитель другого объекта, так как другой объект находится в новом контексте.

Скажем, у меня есть пользователь в сеансе, который я извлек из контекста. Теперь страница перезагружается, этот контекст удален, и создается новый контекст.

someUser = context.First(user => user.id == id);
Session["SomeUser"] = someUser
...
context.Dispose();

Страница Перезагрузить

userAddress = new UserAddress();
userAddress.User = (User)Session["SomeUser"]; //BOOM NOT IN SAME CONTEXT

Я хотел бы сделать следующее:

if(!context.SomeUsers.Contains((User)Session["SomeUSer"]) //Only check context NOT DATABASE
{
   //Reload from database
   //Set user in session to new object
}

Идея состоит в том, что если объект в сеансе не принадлежит текущему контексту, перезагрузите его из базы данных, чтобы он теперь "принадлежал" тому же контексту, что и любой другой объект в текущем контексте. (Я использую контекст для запроса)

UPDATE

Так что я делал это временно, пока не смогу лучше понять, как это исправить:

Int32 sessionUser = sessionUser .UserID;
var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID);
if (userCheck != sessionUser)
{
   sessionUser = userCheck;
}

Идея состоит в том, чтобы увидеть, является ли объект в сеансе (sessionUser) таким же, как объект "в" контексте. Теперь, если работает просто отлично. При первом создании контекста СЛЕДУЕТ попасть в базу данных и захватить пользователя. После сравнения становится очевидным, что они не совпадают, и теперь sesionUser является пользователем в контексте. В следующий раз, если флажок установлен, sessionUser и userToCheck совпадают.

Проблема до сих пор:

var userCheck = EntityContext.Context.ChatUsers.First(item => item.UserID == returnValueID);

ВСЕГДА попадает в базу данных. Это не хорошее решение.

Подробнее

Мех, это может быть ответом в конце концов. Я забыл это правило:

x является свойством типа ObjectQuery. Когда вы выполняете ObjectQuery, он всегда попадет в бэк-магазин. Вот что они делают. Если ты не хочешь выполнить запрос к базе данных, затем не используйте ObjectQuery.

Ответы [ 2 ]

2 голосов
/ 24 марта 2009

Хорошо, понял.

ChatUser userCheck = (ChatUser)EntityContext.Context.GetObjectByKey(returnValue.EntityKey);

if(userCheck != returnValue)
{
   sessionUser = userCheck;
}

Метод GetObjectByKey, который описывается как:

GetObjectByKey пытается получить объект с указанным EntityKey из ObjectStateManager. Если объект в данный момент не загружен в контекст объекта, запрос выполнено в попытке вернуть объект из источника данных.

Сделал некоторое тестирование, и он делает то, что говорит. В первый раз (контекст был создан по запросу), он попадает в базу данных и проверяет этот объект на предмет того, что находится в сессии. Они не одинаковы, поэтому он устанавливает sessionUser для нового объекта, поэтому теперь он имеет sessionUser в контексте и в сеансе. В следующий раз метод GetObjectByKey проверяет только контекст (поскольку Profiler не показал взаимодействия с базой данных). Yay.

0 голосов
/ 24 марта 2009

Почему бы просто не проверить идентификатор пользователя?

context.Users.Any(user => user.Id = ((User)session["SomeUser"]).Id)

Или вы можете просто отсоединить объект пользователя от старого контекста и присоединить его к новому контексту с помощью Context.Attach ().

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