Как изменить значение связанного поля

В качестве простой интуиции о том, что такое big-O (big-O) и big-Θ (big-Theta), они рассказывают о том, как изменяется количество операций, которые необходимо выполнить, когда вы значительно увеличите размер проблема (например, в 2 раза).

Линейная сложность по времени означает, что вы увеличиваете размер в 2 раза, количество шагов, которые вам нужно выполнить, также увеличивается примерно в 2 раза. Это то, что называется Θ(n) и часто взаимозаменяемо, но не точно O(n) (разница между O и Θ заключается в том, что O обеспечивает только верхнюю границу, но Θ гарантирует как верхнюю, так и нижнюю границы). [ 1124]

Логарифмическая временная сложность (Θ(log(N))) означает, что при увеличении размера в 2 раза количество шагов, которые вам нужно выполнить, увеличивается на некоторое фиксированное количество операций. Например, используя бинарный поиск, вы можете найти данный элемент в вдвое длинном списке, используя только одну итерацию цикла руды.

Точно так же экспоненциальная сложность времени (Θ(a^N) для некоторой константы a > 1) означает, что если вы увеличите размер задачи всего на 1, вам потребуется a раз больше операций. (Обратите внимание, что между Θ(2^N) и 2^Θ(N) есть небольшая разница, и фактически второй является более общим, оба лежат в экспоненциальном времени, но ни один из двух не покрывает все это, см. wiki для некоторых других детали)

Обратите внимание, что эти определения в значительной степени зависят от того, как вы определяете «размер задачи»

Как правильно указал @DavidEisenstat, есть два возможных контекста, в которых ваш алгоритм может быть виден:

  1. Некоторые числа фиксированной ширины (например, 32-разрядные числа). В таком контексте очевидной мерой сложности алгоритма первичного тестирования является само проверяемое значение. В таком случае ваш алгоритм является линейным.

  2. На практике существует много контекстов, в которых алгоритм простого тестирования должен работать для действительно больших чисел. Например, многие криптоалгоритмы, используемые сегодня (такие как обмен ключами Диффи-Хеллмана или RSA ), используют очень большие простые числа, такие как 512-битные, 1024-битные и так далее. Также в этом контексте безопасность измеряется количеством этих битов, а не конкретным простым значением. Таким образом, в таких условиях естественным способом измерения размера задачи является количество бит. И теперь возникает вопрос: сколько операций нам нужно выполнить, чтобы проверить значение известного размера в битах, используя ваш алгоритм? Очевидно, что если значение N имеет m битов, оно составляет около N ≈ 2^m. Таким образом, ваш алгоритм из линейного Θ(N) преобразуется в экспоненциальный 2^Θ(m). Другими словами, чтобы решить проблему для значения, которое на 1 бит длиннее, вам нужно выполнить примерно в 2 раза больше работы.

6
задан GEOCHET 7 September 2012 в 21:39
поделиться

3 ответа

Проверьте designer.cs файл. Это - свойство ключа

[Column(Storage="_ParentKey", DbType="Int")]
public System.Nullable<int> ParentKey
{
    get
    {
        return this._ParentKey;
    }
    set
    {
        if ((this._ParentKey != value))
        {
            //This code is added by the association
            if (this._Parent.HasLoadedOrAssignedValue)
            {
                throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
            }
            //This code is present regardless of association
            this.OnParentKeyChanging(value);
            this.SendPropertyChanging();
            this._ParentKey = value;
            this.SendPropertyChanged("ParentKey");
            this.OnServiceAddrIDChanged();
        }
    }
}

И это - свойство ассоциаций.

[Association(Name="Parent_Child", Storage="_Parent", ThisKey="ParentKey", IsForeignKey=true, DeleteRule="CASCADE")]
public Parent Parent
{
    get
    {
        return this._Parent.Entity;
    }
    set
    {
        Parent previousValue = this._Parent.Entity;
        if (((previousValue != value) 
                    || (this._Parent.HasLoadedOrAssignedValue == false)))
        {
            this.SendPropertyChanging();
            if ((previousValue != null))
            {
                this._Parent.Entity = null;
                previousValue.Exemptions.Remove(this);
            }
            this._Parent.Entity = value;
            if ((value != null))
            {
                value.Exemptions.Add(this);
                this._ParentKey = value.ParentKey;
            }
            else
            {
                this._ParentKey = default(Nullable<int>);
            }
            this.SendPropertyChanged("Parent");
        }
    }
}

Лучше присваивать изменения через ассоциацию вместо ключа. Тем путем Вы не должны волноваться о том, загружается ли родитель.

7
ответ дан 16 December 2019 в 21:48
поделиться

Вы хотите, чтобы связаться с другой записью в table1 или изменить table1.id? если это - опция 1, необходимо удалить ту ассоциацию и установить новую. Если опция 2, проверьте Вас дб и посмотрите, располагает ли обновление каскадом да, включил для этого fk и, чем становятся рекордными и значение изменения идентификатора.

0
ответ дан 16 December 2019 в 21:48
поделиться
Table1:       Table2:
ID            ID
Name          Description
              ForeignID

При этом:

Table2.ForeignID = 2

вы получаете сообщение об ошибке ..........

Пример:

Вы можете изменить ForeignID поле в Таблице 2 с этим:

   Table2 table = dataContext.Table2.single(d => d.ID == Id)

   table.Table1 = dataContext.Table1.single(d => d.ID == newId);

Где переменная newId является идентификатором записи в Таблице 2, которую вы хотите связать с записью в Таблице 1

1
ответ дан 16 December 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: