Linq2SQL: объект обновления не создан в текстовом формате. - PullRequest
4 голосов
/ 16 декабря 2008

Обычно, когда вы обновляете объект в linq2sql, вы получаете объект из контекста данных и используете тот же самый текст данных для сохранения объекта, верно?

Каков наилучший способ обновить объект, который не был получен с помощью этого текста данных, который вы используете для выполнения операции сохранения, т.е. я использую flourinefx для передачи данных между flex и asp.net и когда объект возвращается из клиент будет сохранен Я не знаю, как сохранить объект?

   public static void Save(Client client)
    {
        CompanyDataContext db = new CompanyDataContext();
        Validate(client);
        if(client.Id.Equals(Guid.Empty))
        {
            //Create (right?):
            client.Id = Guid.NewGuid();
            db.Clients.InsertOnSubmit(client);
            db.SubmitChanges();
        }
        else
        {
            //Update:
            OffertaDataContext db = new OffertaDataContext();
            db.Clients.????

        }
    }

Обновление: различные подходы к использованию Attach не работают в этом случае. Поэтому я думаю, что необходим подход, основанный на отражении.

Ответы [ 3 ]

6 голосов
/ 16 декабря 2008

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

Метод Attach находится на столе - т.е.

ctx.Customers.Attach(customer); // optional bool to treat as modified
4 голосов
/ 16 декабря 2008

Я думаю, что у вас есть 2 варианта здесь:

1) Прикрепите объект к DataContext, на котором вы будете сохранять 2) Используя первичный ключ вашего объекта, возьмите экземпляр, который присоединен к вашему контексту (например, выполните FirstOrDefault ()), а затем скопируйте данные из измененного объекта в объект, который имеет контекст (отражение может быть полезным здесь).

У Рика Страля есть очень хорошая статья в блоге о присоединении сущностей к контексту по адресу http://www.west -wind.com / weblog / posts / 134095.aspx , особенно в отношении некоторых проблем, которые могут возникнуть столкнуться.

0 голосов
/ 07 апреля 2009

Я надеюсь, что вы можете помочь. Я занимаюсь разработкой многоуровневого веб-сайта с использованием Linq to Sql. Я создал новый класс (или объект) в конструкторе DBML под названием memberState. Этот объект не является реальной таблицей в базе данных. У меня есть этот метод в моем среднем слое:

public override IEnumerable(memberState) GetMembersByState(string @state)<br/>
{<br/>
using (BulletinWizardDataContext context = DataContext)<br/>
{<br/>
IEnumerable(memberState) mems = (from m in context.Members<br/>
join ma in context.MemberAddresses<br/>
on m.UserId equals ma.UserId<br/>
join s in context.States<br/>
on ma.StateId equals s.StateId<br/>
where s.StateName == @state<br/>
select new memberState<br/>
{<br/>
userId = m.UserID,<br/>
firstName = m.FirstName,<br/>
middleInitial = m.MiddleInitial,<br/>
lastName = m.LastName,<br/>
createDate = m.CreateDate,<br/>
modifyDate = m.ModifyDate<br/>
}).ToArray(memberState)();<br/>
return mems;
}
}

Таблицы в моих объединениях (Members, States и MemberAddresses - это реальные таблицы в моей базе данных). Я создал объект memberStates, чтобы я мог использовать его в запросе выше (обратите внимание на Выберите New memberState . Когда данные обновляются на веб-странице, как сохранить изменения обратно в таблицу участников? Мой участник Таблица состоит из следующих столбцов: UserId, FirstName, MiddleInitial, LastName, CreateDate, ModifyDate. Я не уверен, как сохранить изменения обратно в базу данных.

Спасибо

...