linq-to-sql - studio - linq to sql vs entity framework
"La cadena o los datos binarios se truncarían". Excepción de linq, no se puede encontrar qué campo ha excedido la longitud máxima (3)
Establecí la longitud máxima para todos los 350 campos. Supongo que esa es la única manera. gracias por su apoyo.
Cadena o datos binarios podrían truncarse. Linq excepción, no puedo encontrar qué campo ha excedido la longitud máxima.
Tengo alrededor de 350 campos. Verifiqué todos y cada uno de los cuadros de texto maxlength con el campo de la base de datos maxlength, todo parece ser correcto, pero sigo teniendo la excepción.
por favor ayuda
Si marcó la longitud máxima de cada cuadro de texto a la longitud máxima de cada campo, es completamente posible que el error esté ocurriendo a través de un disparador. ¿Hay disparadores en la mesa?
La solución de este error con 350 campos puede ser extremadamente difícil , y el SQL Server Profiler no es de mucha ayuda en este caso (encontrar la cadena larga en el SQL generado es como encontrar una aguja en un pajar).
Por lo tanto, aquí hay una forma automatizada de encontrar las cadenas reales que están excediendo 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 quiera dejarlo en su código de producción, ya que la búsqueda de atributos / propiedades es bastante ineficiente, y agregará una sobrecarga adicional en cada guardado. Simplemente lo incluiré en tu código cuando encuentres este problema y lo eliminaré cuando hayas terminado.
Cómo funciona: itera sobre todas las propiedades de un objeto que está a punto de guardar, encontrando las propiedades con un ColumnAttribute
LINQ to SQL. Luego, si ColumnAttribute.DbType
contiene "varchar", sabes que es una cadena y puedes analizar esa parte del atributo para encontrar la longitud máxima.
Aquí está cómo usarlo:
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);
}
}
}
}