mar*_*c_s 4 glimpse asp.net-4.5 entity-framework-6 ef-bulkinsert
我启动并运行了EF6/ASP.NET 4.5 Webforms解决方案,现在我需要添加一些功能以允许从Excel文件批量插入.
我知道开箱即用的EF并没有针对批量操作进行优化,因此我环顾四周并找到了"EF BulkInsert"(https://efbulkinsert.codeplex.com/)来实现这一点.
我在一个测试应用程序中尝试过,它运行得非常好 - 但是当我将它包含在我的实际主应用程序中时,它就崩溃了.尝试执行实际的批量插入调用时,系统崩溃并出现异常:
BulkInsertProviderNotFoundException:找不到'Glimpse.Ado.AlternateType.GlimpseDbConnection的BulkInsertProvider.要注册新提供程序,请使用EntityFramework.BulkInsert.ProviderFactory.Register()方法'
现在我不确定这是否是Glimpse或EF BulkInsert(或两者)的错误,不幸的是,我似乎无法找到任何解决方案 - 这些软件的制造商都没有提供任何见解或解决方法....
有没有人在这里偶然发现了同样的问题,并找到了解决方案?
小智 6
出现此问题的原因是Glimpse包装DbConnection和 EF BulkInsert扩展尝试访问它的私有字段"_connectionString",它不存在.在这种情况下,我会责怪EF BulkInsert,因为访问私有成员只是不好的做法,并且Glimpse团队的开发人员都没有预料到这一点.
为了解决这个问题,我编写了一个继承自EfSqlBulkInsertProviderWithMappedDataReader(默认提供者)的自定义:
public class GlimpseProvider : EfSqlBulkInsertProviderWithMappedDataReader, IEfBulkInsertProvider
{
private static object GetPrivateFieldValue(object obj, string propName) {
if (obj == null) throw new ArgumentNullException("obj");
Type t = obj.GetType();
FieldInfo fieldInfo = null;
PropertyInfo propertyInfo = null;
while (fieldInfo == null && propertyInfo == null && t != null) {
fieldInfo = t.GetField(propName,
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldInfo == null) {
propertyInfo = t.GetProperty(propName,
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
}
t = t.BaseType;
}
if (fieldInfo == null && propertyInfo == null)
throw new ArgumentOutOfRangeException("propName",
string.Format("Field {0} was not found in Type {1}", propName, obj.GetType().FullName));
if (fieldInfo != null)
return fieldInfo.GetValue(obj);
return propertyInfo.GetValue(obj, null);
}
protected override IDbConnection DbConnection {
get { return (IDbConnection)GetPrivateFieldValue(this.Context.Database.Connection, "InnerConnection"); }
}
}
Run Code Online (Sandbox Code Playgroud)
现在在某个地方注册此提供商.我在上下文OnModelCreating方法中做到了.
EntityFramework.BulkInsert.ProviderFactory.Register<GlimpseProvider>("Glimpse.Ado.AlternateType.GlimpseDbConnection");
Run Code Online (Sandbox Code Playgroud)
请注意,我仅使用EF BulkInsert的基本用法对此进行了测试.
| 归档时间: |
|
| 查看次数: |
748 次 |
| 最近记录: |