Серьезно, расширяемая платформа POCOs никогда не будет сериализировать к XML надежно. Я говорю это, потому что я могу гарантировать, что кто-то приедет, расширит Ваш класс и испортит его.
необходимо изучить использование XAML для сериализации графов объектов. Это разработано, чтобы сделать это, тогда как сериализация XML не.
сериализатор Xaml и deserializer обрабатывают дженерики без проблемы, наборов базовых классов и интерфейсов также (как долго, поскольку сами наборы реализуют IList
или IDictionary
). Существуют некоторые протесты, такие как маркировка Ваших свойств набора только для чтения с эти DesignerSerializationAttribute
, но переделка Вашего кода для обработки этих угловых случаев не является этим трудно.
Квассной прав; триггер был бы лучшим способом добиться этого.
Вот код:
CREATE OR REPLACE FUNCTION enforce_photo_count() RETURNS trigger AS $$
DECLARE
max_photo_count INTEGER := 10;
photo_count INTEGER := 0;
must_check BOOLEAN := false;
BEGIN
IF TG_OP = 'INSERT' THEN
must_check := true;
END IF;
IF TG_OP = 'UPDATE' THEN
IF (NEW.owner != OLD.owner) THEN
must_check := true;
END IF;
END IF;
IF must_check THEN
-- prevent concurrent inserts from multiple transactions
LOCK TABLE photos IN EXCLUSIVE MODE;
SELECT INTO photo_count COUNT(*)
FROM photos
WHERE owner = NEW.owner;
IF photo_count >= max_photo_count THEN
RAISE EXCEPTION 'Cannot insert more than % photos for each user.', max_photo_count;
END IF;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER enforce_photo_count
BEFORE INSERT OR UPDATE ON photos
FOR EACH ROW EXECUTE PROCEDURE enforce_photo_count();
Я включил блокировку таблицы, чтобы избежать ситуаций, когда два одновременных взаимодействия будут подсчитывать фотографии для пользователя, обратите внимание, что текущий счет на 1 ниже limit, а затем обе вставки, что приведет к превышению лимита на 1. Если вас это не беспокоит, лучше всего снять блокировку, поскольку она может стать узким местом при большом количестве вставок / обновлений.
Вы не можете записать такое ограничение в объявлении таблицы.
Есть несколько обходных путей:
столбец photo_order
, в котором будет сохранен порядок фотографий, сделайте (user_id, photo_order)
UNIQUE
и добавьте CHECK (photo_order BETWEEN 1 AND 10)
Мой ответ основан на этом совете на VIM Wiki. В этом ответе используется каталог «after», поэтому вам не придется возиться с предоставленными файлами подключаемых модулей для разных типов файлов.
Например, чтобы указать собственные настройки для файлов Python, создайте файл с именем python.vim
для хранения ваших настроек Python:
setlocal expandtab
setlocal shiftwidth=4
setlocal softtabstop=4
Поместите этот файл в
~ / .vim / after / ftplugin
(Linux) $ HOME / vimfiles / after / ftplugin
(Windows) И наконец, вы должны иметь это в своем .vimrc
(Linux) или _vimrc
(Windows):