Ответ 1
Устранение этой ошибки с 350 полями может быть чрезвычайно сложным, и SQL Server Profiler не очень помогает в этом случае (поиск длинной строки в сгенерированном SQL - это поиск иглы в стоге сена).
Итак, вот автоматический способ поиска фактических строк, превышающих ограничение размера базы данных. Это решение, которое существует в Интернете, в различных формах. Вероятно, вы не хотите оставлять его в своем производственном коде, поскольку поиск атрибутов/свойств довольно неэффективен, и он добавит дополнительные накладные расходы при каждом сохранении. Я просто брошу его в свой код, когда вы столкнетесь с этой проблемой, и удалите его, когда закончите.
Как это работает: выполняет итерацию по всем свойствам объекта, который вы собираетесь сохранить, и обнаруживая свойства с LINQ to SQL ColumnAttribute
. Затем, если ColumnAttribute.DbType
содержит "varchar", вы знаете, что это строка, и вы можете проанализировать эту часть атрибута, чтобы найти максимальную длину.
Здесь, как его использовать:
foreach (object update in context.GetChangeSet().Updates)
{
FindLongStrings(update);
}
foreach (object insert in context.GetChangeSet().Inserts)
{
FindLongStrings(insert);
}
context.SubmitChanges();
И здесь метод:
public static void FindLongStrings(object testObject)
{
foreach (PropertyInfo propInfo in testObject.GetType().GetProperties())
{
foreach (ColumnAttribute attribute in propInfo.GetCustomAttributes(typeof(ColumnAttribute), true))
{
if (attribute.DbType.ToLower().Contains("varchar"))
{
string dbType = attribute.DbType.ToLower();
int numberStartIndex = dbType.IndexOf("varchar(") + 8;
int numberEndIndex = dbType.IndexOf(")", numberStartIndex);
string lengthString = dbType.Substring(numberStartIndex, (numberEndIndex - numberStartIndex));
int maxLength = 0;
int.TryParse(lengthString, out maxLength);
string currentValue = (string)propInfo.GetValue(testObject, null);
if (!string.IsNullOrEmpty(currentValue) && maxLength != 0 && currentValue.Length > maxLength)
Console.WriteLine(testObject.GetType().Name + "." + propInfo.Name + " " + currentValue + " Max: " + maxLength);
}
}
}
}