N-Tiered LinqToSql Вопрос - PullRequest
       22

N-Tiered LinqToSql Вопрос

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

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

публичное переопределение IEnumerable (memberState) GetMembersByState (string @state)
{
использование (BulletinWizardDataContext context = DataContext)
{
IEnumerable (memberState) mems = (из m в контексте. Члены
присоединиться к ма в контексте. Адреса членов
на m.UserId равно ma.UserId
присоединиться к s в контексте. Государства
на ma.StateId равно s.StateId
где s.StateName == @state
выберите нового участникаState
{
userId = m.UserID,
firstName = m.FirstName,
middleInitial = m.MiddleInitial,
lastName = m.LastName,
createDate = m.CreateDate,
modifyDate = m.ModifyDate
}) ToArray (memberState) ();.
вернуть мемы;
}
}

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

Спасибо

Ответы [ 3 ]

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

Если у вас есть таблица членов, dbml, скорее всего, будет содержать класс участников. Чтобы обновить члена в базе данных, вам нужно будет создать новый объект Member и прикрепить его к коллекции BulletinWizardDataContext.Members. Что-то похожее на следующий код должно сработать (я не проверял код):

using (BulletinWizardDataContext context = DataContext)
{
    Member m = new Member() { UserId = userId };
    context.Members.Attach(m);
    m.FirstName = firstName;
    // Set other properties
    context.SubmitChanges();
}

Присоединение должно быть вызвано перед настройкой свойств. Кроме того, у Linq2Sql есть некоторые проблемы с Attach в случае, когда для свойств вашего объекта установлены значения по умолчанию (т. Е. 0 для числовых значений, false для логических значений, ноль для строки и т. Д.). В этом случае Attach не будет генерировать правильный SQL.

0 голосов
/ 12 апреля 2009
var m = myContext.Members.Single(m=> m.UserID == myMemState.userID);
m.FirstName = myMemState.firstName;
m.MiddleInitial = myMemState.middleInitial;
...

Это был бы быстрый способ. Это делает дополнительную поездку туда и обратно, но будет работать хорошо. Если это проблема для вас, тогда делайте Attach, как предложил Jakob. Для этого вам необходимо выполнить некоторые дополнительные шаги, например, просмотреть конфигурацию для оптимистических обновлений и убедиться, что у вас есть исходные поля при выполнении присоединения.

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

Если я правильно помню, вы можете создать представление из разных таблиц (Members, States и MemberAddresses) и добавить его в контекст данных. Тогда любые изменения данных в объекте представления могут быть сохранены, и linq to sql будет правильно обрабатывать принятие, если все отношения четко установлены / определены как в базе данных, так и в контексте данных.

...