Nano Hash - криптовалюты, майнинг, программирование

Linq to SQL — отключить UpdateCheck в коде

Я хочу отключить функцию UpdateCheck для всех участников (кроме их первичных ключей). Теперь я следовал приведенному ниже примеру в качестве руководства, однако мои элементы MetaDataMembers таблицы по-прежнему установлены на Always.

http://www.the-lazy-coder.com/2013/04/set-updatecheck-to-never.html

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

Теперь, если бы я изменил подход и просто получил MetaDataMembers непосредственно из RowType, я бы заметил, что у них есть свойство UpdateCheck, но только геттер. Итак, есть ли способ (через отражение, если необходимо) перезаписать это свойство после его установки? Даже после просмотра декомпилированного исходного кода это абстрактный класс, и я не могу найти никаких реализаций, которые можно было бы использовать для справки.

Я использую SQLMetal для создания файлов контекста, поэтому нет возможности что-либо изменить в дизайнере, и хотя некоторые люди скажут, что мне следует запустить некоторые макросы редактирования текста для анализа и изменения атрибутов, все это звучит слишком затянуто, когда я должен просто иметь возможность войти в объект в памяти и сказать ему игнорировать все, что ему было сказано ранее.

ТАК! Есть ли способ переопределить свойство в сущностях? Я попытался запустить исходный код в этой ссылке в обоих конструкторах, после создания объектов и непосредственно перед тем, как я собираюсь сделать обновление, однако ни одно из изменений, похоже, не сохраняется или, по крайней мере, не распространяется туда, где это важно, и вряд ли любой материал о том, как сделать что-либо из этого прогматически.


Ответы:


1

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

public static void SetUpdateCheckStatus(this IDataContext dataContext, UpdateCheck updateCheckStatus)
        {
            var tables = dataContext.Mapping.GetTables();
            foreach (var table in tables)
            {
                var dataMembers = table.RowType.DataMembers;
                foreach (var dataMember in dataMembers)
                {
                    if (!dataMember.IsPrimaryKey)
                    {
                        var dataMemberType = dataMember.GetType();
                        if (dataMemberType.Name == "AttributedMetaDataMember")
                        {
                            var underlyingAttributeField = dataMember.GetType().GetField("attrColumn", BindingFlags.Instance | BindingFlags.NonPublic);
                            if (underlyingAttributeField != null)
                            {
                                var underlyingAttribute = underlyingAttributeField.GetValue(dataMember) as ColumnAttribute;
                                if (underlyingAttribute != null)
                                { underlyingAttribute.UpdateCheck = updateCheckStatus; }
                            }
                        }
                        else
                        {
                            var underlyingField = dataMember.Type.GetField("updateCheck", BindingFlags.Instance | BindingFlags.NonPublic);
                            if (underlyingField != null)
                            { underlyingField.SetValue(dataMember, updateCheckStatus); }
                        }
                    }
                }
            }
        }

IDataContext — это всего лишь обертка, которую мы поместили вокруг DataContext для издевательских целей, так что не стесняйтесь менять ее на просто DataContext. Он написан крайне осторожно, так как таким образом отбрасываются многие элементы, у которых нет всех желаемых данных, поэтому он должен отфильтровывать их и работать только с теми, у которых они есть.

14.06.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..