【发布时间】:2009-10-27 12:06:19
【问题描述】:
我知道下面的方法不适用于任何实体,不应强制使用它。
我找到了一个 System.Data.Linq.Table 扩展方法,它使用 SqlBulkCopy 插入数据。我正在尝试使其适应实体框架,但它引发了一个奇怪的异常,而原来的适用于 Linq-To-Sql 数据类。到目前为止,我找不到该缺陷,它发生在任何 SQL 表中,在 1-1 映射中。你能帮帮我吗?
public static class ObjectQueryExtensions
{
public static string GetName<TEntity>(
this ObjectQuery<TEntity> objectQuery)
where TEntity : class
{
var tableNameGroup = new Regex(@"FROM\s([^\s]*)\s"
, RegexOptions.IgnoreCase);
var sql = objectQuery.ToTraceString();
var tableNameGroupMatch = tableNameGroup.Match(sql);
return tableNameGroupMatch.Groups[1].Value;
}
public static void BulkInsert<TEntity>(
this ObjectQuery<TEntity> objectQuery
, IEnumerable<TEntity> items)
where TEntity : class
{
using (var dt = new DataTable())
{
var properties = typeof(TEntity)
.GetProperties()
.Where(property => property.Name != "EntityKey")
.Where(property => property.Name != "EntityState")
;
foreach (var property in properties)
{
dt.Columns.Add(property.Name
, Nullable.GetUnderlyingType(property.PropertyType)
?? property.PropertyType);
}
foreach (var t in items)
{
DataRow row = dt.NewRow();
foreach (var info in properties)
{
row[info.Name] = info.GetValue(t, null) ?? DBNull.Value;
}
dt.Rows.Add(row);
}
var entityConnection = (EntityConnection)objectQuery
.Context.Connection;
using (var sqlBulkCopy = new SqlBulkCopy(
entityConnection.StoreConnection.ConnectionString))
{
sqlBulkCopy.DestinationTableName = objectQuery.GetName();
sqlBulkCopy.WriteToServer(dt);
}
}
}
}
例外
测试方法 LinqExtensionsTest.ObjectQueryExtensionsTest.BulkInsertTest 抛出异常:System.InvalidOperationException:来自数据源的 Int64 类型的给定值无法转换为指定目标列的日期时间类型。 ---> System.InvalidCastException:无法将参数值从 Int64 转换为 DateTime。 ---> System.InvalidCastException:从“Int64”到“DateTime”的无效转换..
堆栈跟踪
System.Int64.System.IConvertible.ToDateTime(IFormatProvider 提供程序) System.Convert.ChangeType(对象值,类型转换类型,IFormatProvider 提供程序) System.Data.SqlClient.SqlParameter.CoerceValue(对象值,元类型destinationType) System.Data.SqlClient.SqlParameter.CoerceValue(对象值,元类型destinationType) System.Data.SqlClient.SqlBulkCopy.ConvertValue(对象值,_SqlMetaData 元数据) System.Data.SqlClient.SqlBulkCopy.ConvertValue(对象值,_SqlMetaData 元数据) System.Data.SqlClient.SqlBulkCopy.WriteToServerInternal() System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServer(Int32 columnCount) System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable 表,DataRowState 行状态) System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable 表) LinqExtensions\LinqExtensions\ObjectQueryExtensions.cs 中的 LinqExtensions.ObjectQueryExtensions.BulkInsert[TEntity](ObjectQuery
1 objectQuery, IEnumerable1 项):第 60 行 LinqExtensions\LinqExtensionsTest\ObjectQueryExtensionsTest.cs 中的 LinqExtensionsTest.ObjectQueryExtensionsTest.BulkInsertTest():第 88 行
【问题讨论】:
标签: c# .net linq entity-framework datatable