Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Linq2Sql, проблемы с Update


Автор: Red Wind 10.7.2009, 00:18
Доброго времени суток,
Работаю с Linq2Sql, пытаюсь делать Update отсоединённой записи. Но он не работает. Ошибок не падает, но обновление не происходит и профайлер не показывает обращений к базе. Insert и Select работают нормально. Вот код:
Код

    public class DataProvider: IDataProvider
    {
        private const string ConnectionStringName = "Veles.BloodPressure.LinqToSqlDal.Properties.Settings.BloodPressureConnectionString";
        private static BloodPressureDataContext BloodPressure = new BloodPressureDataContext(ConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString);

        public void UpdateUser(UserDto userDto)
        {
            var user = GetUserEntity(userDto);
            BloodPressure.Users.Attach(user);
            BloodPressure.SubmitChanges();
        }

        public static User GetUserEntity(UserDto dto)
        {
            var user = new User
            {
                Address = dto.Address
                DateOfBirth = dto.DateOfBirth,
                Email = dto.Email,
                FirstName = dto.FirstName,
                UserId = dto.UserId,
                LastName = dto.LastName,
                Login = dto.Login,
                Password = dto.Password,
                Phone1 = dto.Phone1,
                Phone2 = dto.Phone2,
                Note = dto.Note
            };
            return user;
        }
}

Автор: KelTron 10.7.2009, 04:58
А так чем не устраивает?

Код

public void UpdateUser(UserDto userDto)
{
    var user = BloodPressure.Users.Single(u => u.UserId == userDto.UserId);
    user.Address = userDto.Address;
    user.DateOfBirth = userDto.DateOfBirth;
    user.Email = userDto.Email;
    user.FirstName = userDto.FirstName;
    user.LastName = userDto.LastName;
    user.Login = userDto.Login;
    user.Password = userDto.Password;
    user.Phone1 = userDto.Phone1;
    user.Phone2 = userDto.Phone2;
    user.Note = userDto.Note;

    BloodPressure.SubmitChanges();
}


Автор: Idsa 10.7.2009, 05:46
Red Wind, эта последовательность действий:
Код

            BloodPressure.Users.Attach(user);
            BloodPressure.SubmitChanges();

бессмысленна: при аттаче сущность будет помечена неизмененной (ну действительно, откуда LINQ To SQL знать, какие поля Вы изменяли, а какие - нет).

Attach имеет смысл, когда у Вас 2 версии одного и того же объекта: считанная (содержащая original values) и измененная. Тогда можно сделать Attach считанной сущности, затем внести в приаттаченную сущность изменения на основании данных измененной сущности и сделать Submit.

Автор: Red Wind 10.7.2009, 11:27
Idsa,  спасибо за инфу. Понял, что надо почитать матчастьsmile.
Я добавил вызов метода Refresh. Теперь всё заработало.
Код

            BloodPressure.Users.Attach(user);
            BloodPressure.Refresh(RefreshMode.KeepCurrentValues, user);
            BloodPressure.SubmitChanges();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)