此問題的原因掠影包裝的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"); }
}
}
現在的地方註冊這個提供。我在上下文OnModelCreating方法中做了它。
EntityFramework.BulkInsert.ProviderFactory.Register<GlimpseProvider>("Glimpse.Ado.AlternateType.GlimpseDbConnection");
要知道,我只用EF BulkInsert的基本用法測試這一點。
非常感謝 - 作品魅力! –
謝謝,這真的很有幫助! –