Проблема обновления Linq 2 Sql DataContext во время процесса выборки / редактирования / обновления - PullRequest
1 голос
/ 02 января 2011

Во многих моих методах действий ASP.Net MVC 3 у меня возникают серьезные проблемы с попыткой обновить запись (или набор записей), что приводит к следующему исключению:

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

Это потому, что я извлекаю запись из своего репозитория, используя один DataContext, а затем, после редактирования этой записи, пытаюсь сохранить ее, используя другой новый DataContext (то есть два отдельных метода в моем репозитории).

Проблема описана лучше, чем я когда-либо мог, в этом посте в блоге AzamSharp, озаглавленном Работа с LINQ to SQL. Проблемы с контентом в данных:

http://geekswithblogs.net/AzamSharp/archive/2008/05/17/122222.aspx

Я сталкиваюсь со многими, многими постами здесь и в других местах с различными предложениями, исправлениями и обходными путями, но тот факт, что этот, казалось бы, обычный рабочий процесс не поддерживается естественным образом в Linq 2 Sql, сводит меня с ума.

У меня вопрос (а): нужно ли отказаться от Linq 2 Sql для лучшего подхода, который обрабатывает этот рабочий процесс изначально? Если так, где я должен искать (EF, EF Code First, третье лицо)? Если нет, как вы справляетесь с этим и заставляете его работать (отсоединяете методы в частичных классах, отметках времени и т. Д.)?

Я мог бы написать конкретные методы, которые обрабатывают запрос и обновлять в одном вызове метода, но это потребовало бы от меня добавить бизнес-логику в хранилище, что является нет-нет (или мне так сказали). Плюс это звучит как хранимая процедура, обернутая в синтаксис C #. В некотором смысле, Linq 2 Sql излишним в этот момент.

Спасибо за предложения. И если вам нужны примеры кода и т. Д., Пожалуйста, посмотрите на пост в блоге выше. Это гораздо более красноречиво, чем я мог бы быть в этой точке.

Ответы [ 2 ]

1 голос
/ 02 января 2011

Я бы использовал DataContext, который создается каждый раз, когда вы создаете экземпляр репозитория, а не создавал DataContext для каждого вызова метода, как в примере.

Вот пример из NerdDinners Учебное пособие , написанное ScottGu о том, как использовать Linq To Sql с ASP.NET MVC.Он использует один DataContext для каждого хранилища.Это создаст новый репозиторий для каждого веб-запроса.

public class DinnerRepository 
{
    private NerdDinnerDataContext db = new NerdDinnerDataContext();

    //    
    // Query Methods
    public IList<Dinner> FindAllDinners() 
    {
        return db.Dinners.ToList();
    }  

    public IList<Dinner> FindUpcomingDinners() 
    {
        return (from dinner in db.Dinners
               where dinner.EventDate > DateTime.Now
               orderby dinner.EventDate
               select dinner).ToList();
    }    

    public Dinner GetDinner(int id) 
    {
        return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
    }

    //
    // Insert/Delete Methods
    public void Add(Dinner dinner) 
    {
        db.Dinners.InsertOnSubmit(dinner);
    }    

    public void Delete(Dinner dinner) 
    {
        db.RSVPs.DeleteAllOnSubmit(dinner.RSVPs);
        db.Dinners.DeleteOnSubmit(dinner);
    }    

    //
    // Persistence 
    public void Save() 
    {
        db.SubmitChanges();
    }
}

В более сложных сценариях вы можете создать DataContext и прикрепить его к текущему потоку в ASP.NET, если вам нужно совместно использовать DataContext через несколькоХранилища.

0 голосов
/ 02 января 2011

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

Сказав все это, в прошлом я старался делать то, что предлагает Джоэл.т. е. иметь контекст, связанный со всем хранилищем.

Если вы ищете другие фреймворки - Entity Frameworks поддерживает самосопровождающие сущности и отключенные контексты данных, чтобы это работало для вас;однако я думаю, что вы должны быть в состоянии достичь желаемого поведения с L2S.

...