Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Attribute property IsVersion, Как юзать? 
V
    Опции темы
Veitmen
Дата 18.6.2008, 04:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Народ, столкнулся с такой траблой, хочу у всех своих записей вести версицирование. Если я добавляю поле Version типа int и помечаю атрибутом IsVersion = true, то я так понимаю Linq должен сам генрить версию или нет? Помогите разобраться с этим вопросом, как правильно генерить версию? Если я ставлю в бд инкрементацию на это поле, то получается пара проблем, во первых версия увеличивается на 1 при каждой новой вставке, а я так не хочу, я хочу что бы у каждой записи в БД велся свой порядок версий, а во вторых не проиходит обновление версии при обновлении поля. 
Ручками делать не получается, т.к. если атрибут IsVersion выставлен то Linq не позволяет мне менять значение этого поля. Может быть надо юзать хранилки или триггеры? ПОмогите! 

Это сообщение отредактировал(а) Veitmen - 18.6.2008, 06:41
PM MAIL ICQ   Вверх
Veitmen
Дата 18.6.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



При этом мне не нужны byte[]. 

Это сообщение отредактировал(а) Veitmen - 18.6.2008, 09:30
PM MAIL ICQ   Вверх
Idsa
Дата 18.6.2008, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 5
Всего: 62



Veitmen, используйте тип TimeStamp в SqlServer. Значение этого типа обновляется при любых изменениях в записи.

Цитата(Veitmen @  18.6.2008,  13:29 Найти цитируемый пост)
При этом мне не нужны byte[].

Не понял.

Это сообщение отредактировал(а) Idsa - 18.6.2008, 10:50


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Veitmen
Дата 18.6.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Цитата(Idsa @  18.6.2008,  10:47 Найти цитируемый пост)
Цитата(Veitmen @  18.6.2008,  13:29 )При этом мне не нужны byte[].Не понял.

Для работы с TimeStamp приходится использовать byte[]. Мне желательно int или на худой конец string. Вот. Как делать в таком случае? Если для int выставить IsVersion то я его менять уже не могу.
PM MAIL ICQ   Вверх
Idsa
Дата 18.6.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 5
Всего: 62



Цитата(Veitmen @  18.6.2008,  14:58 Найти цитируемый пост)
Если для int выставить IsVersion то я его менять уже не могу. 

А зачем его менять? Оно же автоматически генерируется.

Цитата(Veitmen @  18.6.2008,  14:58 Найти цитируемый пост)
Для работы с TimeStamp приходится использовать byte[]. Мне желательно int или на худой конец string

Дело обстоит так. Есть стандартное средство в виде типа TimeStamp, который хранит массив байт. Не знаю, чем Вам байты не угодили... но если хочется, чтобы эту функциональность выполняли int'ы, то Вам придется создать After Trigger на Update и Insert и обновлять это поле. И так с каждей таблицей... По крайней мере в рамках моих нынешних познаний Sql Server'а других вариантов я не вижу.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Veitmen
Дата 18.6.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



ыыы Жестко блин.(( МОжет кто знает какое нибудь еще решение? Приведите пример триггера плиз, если ва не затруднит.
PM MAIL ICQ   Вверх
Idsa
Дата 18.6.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 5
Всего: 62



Цитата(Veitmen @  18.6.2008,  15:10 Найти цитируемый пост)
Приведите пример триггера плиз, если ва не затруднит. 

Триггер здесь несложный... но для начала я хотел бы узнать, чем именно Вас не устраивает стандартное решение. Чем не угодил массив байт?

Это сообщение отредактировал(а) Idsa - 18.6.2008, 11:21


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Veitmen
Дата 18.6.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Проблема у меня при сериализации и десириализации. Мы не хотим передавать байты...
PM MAIL ICQ   Вверх
Veitmen
Дата 18.6.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Приведите пожалуйста пример триггера на инкремент.
PM MAIL ICQ   Вверх
Idsa
Дата 18.6.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 5
Всего: 62



Цитата(Veitmen @  18.6.2008,  15:23 Найти цитируемый пост)
Мы не хотим передавать байты... 

Ну ведь int тоже из байт состоит smile Весит TimeStamp 8 байт (в 2 раза больше int и столько же, сколько и bigint), и я не вижу в этом проблемы.

Для того чтобы было с чем сравнить, я все-таки написал триггер.
Заранее предупреждаю, что в SQL я не мастер smile
Есть таблица TestTable:
Id Int NOT NULL Identity(1, 1)
Name VarChar(10)
Version Int

Создаем для таблицы следующий тригер
Код

USE [TestDb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [VersionTriggerForTestTable]  
   ON  [dbo].[TestTable] 
   AFTER INSERT, UPDATE
AS
BEGIN
    DECLARE @Id INT, @Version INT
    SET @Id = (SELECT Id FROM Inserted)
    SET @Version = (SELECT Version FROM Inserted WHERE Id=@Id)
    If @Version IS NULL
        SET @Version = 0;

    UPDATE dbo.TestTable
    SET Version = @Version + 1
    WHERE Id = @Id
END

Теперь пробуем последовательно выполнить в Management Studio сначала запрос на вставку:
Код

INSERT INTO dbo.TestTable (Name)
VALUES ('abc');

SELECT * FROM dbo.TestTable

, а потом обновляем запись с заданным Id:
Код

UPDATE dbo.TestTable
SET Name = 'cba'
WHERE ID=20

SELECT * FROM dbo.TestTable

После обновления значение Version увеличилось на единицу.

Это упрощенная версия необходимого для решения Вашей задачи тригера. Например, стоит добавить условие, чтобы при переполнении счетчик сбрасывался на ноль.

Это сообщение отредактировал(а) Idsa - 18.6.2008, 12:25


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Veitmen
Дата 20.6.2008, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Idsa, спасибо что напомнил.  smile 
В общем решил задачу именно через триггеры. Не забываем указывать аттрибуты IsVersion и IsDbGenerate. Иначе Linq будет ругаться на изменение данных через триггеры. Вопрос решен. Idsa +1.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.