Почему я должен использовать GetOriginalEntityState () в моем методе сохранения в хранилище LINQ To SQL? - PullRequest
5 голосов
/ 13 августа 2010

Я смотрю на пример метода сохранения в репозитории Products из книги Стивена Сандерсона, Pro ASP.NET MVC 2 Framework:

public void SaveProduct(Product product)
{
    // if new product, attach to DataContext:
    if (product.ProductID == 0)
        productsTable.InsertOnSubmit(product);
    else if (productsTable.GetOriginalEntityState(product) == null)
    { 
        // we're updating existing product
        productsTable.Attach(product);
        productsTable.Context.Refresh(RefreshMode.KeepCurrentValues, product);
    }
    productsTable.Context.SubmitChanges();            
}

Я не понимаю логику в else if line:

else if (productsTable.GetOriginalEntityState(product) == null)

Насколько я понимаю, GetOriginalEntityState() возвращает исходное состояние указанной сущности .. в данном случае эта сущность равна product.

Так что еслиутверждение звучит как: «Если оригинал не существует, то ...» , но это не имеет смысла, потому что книга говорит, что это проверяет, что мы модифицируем запись, которая уже существует.

Как мне понимать GetOriginalEntityState в этом контексте?

Редактировать

Кстати, этот отрывок взят из главы 6, стр. 191 ... на всякий случайУ кого-нибудь есть книга, и она хочет ее найти.Книга просто имеет эту функцию в примере кода, но никогда не объясняет, что делает функция.

1 Ответ

5 голосов
/ 13 августа 2010

Это немного догадка, так как я на самом деле никогда не использовал GetOriginalEntityState, но вопрос заинтересовал меня, чтобы выяснить, что происходит.

Я думаю, что цель здесь состоит в том, чтобы проверить, что product все еще прикреплен к исходному DataContext

Строка:

if (productsTable.GetOriginalEntityState(product) == null) 

Я думаю, что это вернет ноль, если product был отсоединен или создан вручную и не обработанDataContext.

С MSDN :

Этот метод возвращает исходное состояние объекта, поскольку он был создан или присоединен к текущему DataContext.Исходное состояние объекта, который был сериализован и десериализован, должен быть предоставлен независимым механизмом отслеживания и предоставлен, когда объект присоединен к новому DataContext.Для получения дополнительной информации см. Операции получения данных и CUD в приложениях N-уровня (LINQ to SQL).

Я думаю, что ключевая строка для понимания:

Этот методвозвращает исходное состояние объекта, так как он был создан или присоединен к текущему DataContext.

GetOriginalEntityState используется для того, чтобы метод мог получить объект с возможностью не присоединяться уже кDataContext.Прикрепленное значение, возвращаемое вызовом Linq To SQL, а не просто создание экземпляра типа Product p = new Product() { ... };.Если он не присоединен, он присоединит его к DataContext и сохранит любое из значений, которые были изменены (с сохранением значений обновления) из-за параметра RefreshMode.KeepCurrentValues.

Тогда productsTable.Context.SubmitChanges(); всегдаЭто происходит потому, что даже если он отсоединен, GetOriginalEntityState позаботится о том, чтобы он был присоединен, и отправка будет работать.

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