Конфликт данных в LINQ

Чтобы соответствовать 8 строкам символов, которые могут содержать только цифры и необязательную запятую, вы можете использовать

^(?=.{8}$)\d+,?\d+$

См. демонстрацию regex

Для просмотра требуется, чтобы строка содержала 8 символов. ,? сделает сопоставление запятой необязательным, а + после \d потребует не менее 1 цифры до и после дополнительной запятой.

Если вам нужно сопоставить строку с 8 цифрами и необязательную запятую, вы можете использовать

^(?:(?=.{9}$)\d+,\d+|\d{8})$

См. демонстрацию regex

. Собственно, строка будет содержать 9 символов в строке (если это имеет запятую) или просто 8 - если есть только цифры.

Объяснение:

  • ^ - начало строки
  • (?:(?=.{9}$)\d+,\d+|\d{8}) - 2 альтернативы: (?=.{9}$)\d+,\d+ - 1 + цифры, за которыми следуют 1 запятая, за которой следуют 1 + цифры, а вся строка соответствует длине 9 символов (8 цифр и 1 запятая) | - или \d{8} - 8 цифр
  • $ - конец строки

См. демонстрацию кода Java Java (обратите внимание, что с String#matches(), ^ и $ якоря в начале и конце шаблона являются избыточными и могут быть опущены, поскольку шаблон привязывается по умолчанию при использовании с этим методом):

List strs = Arrays.asList("0123,,678", "0123456", // bad
        "01234,567", "01234567" // good
    );
for (String str : strs)
    System.out.println(str.matches("(?:(?=.{9}$)\\d+,\\d+|\\d{8})"));

ПРИМЕЧАНИЕ ДЛЯ КОМАНД ДЛЯ ВЕДУЩИХ / ТРЕНИРОВОК:

You ju st необходимо заменить + ( совпадение 1 или более вхождений ) квантификаторов на * (, совпадающих с 0 или более вхождениями ) в первой альтернативной ветви, чтобы позволить начало / конец запятые:

^(?:(?=.{9}$)\d*,\d*|\d{8})$

См. эту демонстрацию regex

19
задан Charles Menguy 26 April 2012 в 00:45
поделиться

5 ответов

Вот способ видеть, где конфликты (это - пример MSDN, таким образом, необходимо будет в большой степени настроить):

try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
    Console.WriteLine("Optimistic concurrency error.");
    Console.WriteLine(e.Message);
    Console.ReadLine();
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        MetaTable metatable = db.Mapping.GetTable(occ.Object.GetType());
        Customer entityInConflict = (Customer)occ.Object;
        Console.WriteLine("Table name: {0}", metatable.TableName);
        Console.Write("Customer ID: ");
        Console.WriteLine(entityInConflict.CustomerID);
        foreach (MemberChangeConflict mcc in occ.MemberConflicts)
        {
            object currVal = mcc.CurrentValue;
            object origVal = mcc.OriginalValue;
            object databaseVal = mcc.DatabaseValue;
            MemberInfo mi = mcc.Member;
            Console.WriteLine("Member: {0}", mi.Name);
            Console.WriteLine("current value: {0}", currVal);
            Console.WriteLine("original value: {0}", origVal);
            Console.WriteLine("database value: {0}", databaseVal);
        }
    }
}

, Чтобы заставить его проигнорировать проблему и фиксацию так или иначе:

db.SubmitChanges(ConflictMode.ContinueOnConflict);
24
ответ дан 30 November 2019 в 02:39
поделиться

Они (то, которое Вы могли добавить в частичном классе к своему datacontext, могло бы помочь Вам понять, как это работает:

public void SubmitKeepChanges()
{
    try
    {
        this.SubmitChanges(ConflictMode.ContinueOnConflict);
    }
    catch (ChangeConflictException e)
    {
        foreach (ObjectChangeConflict occ in this.ChangeConflicts)
        {
            //Keep current values that have changed, 
//updates other values with database values

            occ.Resolve(RefreshMode.KeepChanges);
        }
    }
}

public void SubmitOverwrite()
{
    try
    {
        this.SubmitChanges(ConflictMode.ContinueOnConflict);
    }
    catch (ChangeConflictException e)
    {
        foreach (ObjectChangeConflict occ in this.ChangeConflicts)
        {
            // All database values overwrite current values with 
//values from database

            occ.Resolve(RefreshMode.OverwriteCurrentValues);
        }
    }
}

public void SubmitKeepCurrent()
{
    try
    {
        this.SubmitChanges(ConflictMode.ContinueOnConflict);
    }
    catch (ChangeConflictException e)
    {
        foreach (ObjectChangeConflict occ in this.ChangeConflicts)
        {
            //Swap the original values with the values retrieved from the database. No current value is modified
            occ.Resolve(RefreshMode.KeepCurrentValues);
        }
    }
}
19
ответ дан 30 November 2019 в 02:39
поделиться

Я получил эту ошибку при обстоятельстве, абсолютно не связанном с тем, что описывает сообщение об ошибке.

то, Что я сделал, было загрузить объект LINQ через один DataContext, и затем попробованный к SubmitChanges () для объекта через другой DataContext - дал эту точно ту же самую ошибку.

то, Что я должен был сделать, было назвать DataContext. Таблица. Присоединение (myOldObject), и затем называет SubmitChanges (), работал как очарование.

Стоящий взгляда, особенно если Вы имеете мнение, что действительно не должно быть никакими конфликтами вообще.

4
ответ дан 30 November 2019 в 02:39
поделиться

Ошибка "строка, не найденная или измененная" также, будет появляться иногда, когда столбцы или типы в O/R-Designer не будут соответствовать столбцам в базе данных SQL, особенно если один столбец является NULLable в SQL, но не nullable в O/R-Designer.

Так проверяют, соответствует ли Ваша таблица, отображающаяся в O/R-Designer, Вашей базе данных SQL!

2
ответ дан 30 November 2019 в 02:39
поделиться

"и также есть ли способ заставить LINQ игнорировать проблему и просто фиксировать данные независимо?"

можно установить свойство 'Update Check' на объекте к 'Никогда' не остановить то поле, используемое для проверки оптимистичного параллелизма.

можно также использовать:

db.SubmitChanges(ConflictMode.ContinueOnConflict)
-1
ответ дан 30 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

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