solucionar este error con 350 campos puede ser extremadamente difícil, y SQL Server no es de mucha ayuda en este caso (la búsqueda de la cadena larga en el SQL generado es como encontrar una aguja en un pajar).
Por lo tanto, aquí hay una forma automatizada de para encontrar las cadenas reales que exceden el límite de tamaño de la base de datos. Esta es una solución que está disponible en internet, en varias formas. Probablemente no desee dejarlo en su código de producción, ya que la búsqueda de atributo/propiedad es bastante ineficiente, y agregará gastos adicionales en cada guardado. Simplemente lo lanzaría en tu código cuando encontraras este problema, y lo eliminaría cuando termines.
Cómo funciona: itera sobre todas las propiedades de un objeto que está a punto de guardar, la búsqueda de las propiedades con un LINQ a SQL ColumnAttribute
. Entonces, si el ColumnAttribute.DbType
contiene "varchar", usted sabe que es una cadena y puede analizar esa parte del atributo para encontrar la longitud máxima.
Así es como se usa:
foreach (object update in context.GetChangeSet().Updates)
{
FindLongStrings(update);
}
foreach (object insert in context.GetChangeSet().Inserts)
{
FindLongStrings(insert);
}
context.SubmitChanges();
Y aquí está el método:
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);
}
}
}
}
compruebe el enlace actualizado –
No olvide marcar la respuesta como aceptada si obtuvo la información que desea –