gpt4 book ai didi

entity-framework-6 - EF.BulkInsert 和 Glimpse - 不能很好地配合

转载 作者:行者123 更新时间:2023-12-04 23:40:50 27 4
gpt4 key购买 nike

我有一个 EF6/ASP.NET 4.5 Webforms 解决方案启动并运行,现在我需要添加一些功能以允许从 Excel 文件批量插入。

我知道开箱即用的 EF 并未针对批量操作进行优化,因此我环顾四周,发现“EF BulkInsert”(https://efbulkinsert.codeplex.com/)就是为了方便这一点。

我在一个测试应用程序中尝试过它,它运行得非常好——但是当我将它包含在我的实际主应用程序中时,它就崩溃了。尝试执行实际的批量插入调用时,系统崩溃并出现异常:

BulkInsertProviderNotFoundException: BulkInsertProvider not found for 'Glimpse.Ado.AlternateType.GlimpseDbConnection. To register new provider use EntityFramework.BulkInsert.ProviderFactory.Register() method'



现在我不确定这是否是 Glimpse 或 EF BulkInsert(或两者)的错,不幸的是,我似乎找不到任何解决方案 - 这些软件的制造商都没有提供任何见解或解决方法......

这里有没有人偶然发现同样的问题,并找到了解决方案?

最佳答案

出现此问题是因为 Glimpse 包装了 DbConnection 并且 EF BulkInsert 扩展尝试访问它的私有(private)字段“_connectionString”,但该字段不存在。
在这种情况下,我会责怪 EF BulkInsert,因为访问私有(private)成员只是不好的做法,而且 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"); }
}
}

现在在某处注册此提供程序。我在上下文 OnModelCreating 方法中做到了。

EntityFramework.BulkInsert.ProviderFactory.Register<GlimpseProvider>("Glimpse.Ado.AlternateType.GlimpseDbConnection");

请注意,我仅使用 EF BulkInsert 的基本用法对此进行了测试。

关于entity-framework-6 - EF.BulkInsert 和 Glimpse - 不能很好地配合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38248080/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com