我目前正在使用hugocl的EntityFramework.BulkInsert-ef6-ext。我的软件目前每天都在运行,我得到了#34;没有提供表格映射。"偶尔,每周大约1到2次,而剩下的时间它运行良好。
以下是错误堆栈跟踪:
at EntityFramework.BulkInsert.Helpers.MappedDataReader`1..ctor(IEnumerable`1 enumerable, IEfBulkInsertProvider provider)
at EntityFramework.BulkInsert.Providers.EfSqlBulkInsertProviderWithMappedDataReader.Run[T](IEnumerable`1 entities, SqlTransaction transaction)
at EntityFramework.BulkInsert.Providers.ProviderBase`2.Run[T](IEnumerable`1 entities, IDbTransaction transaction)
at EntityFramework.BulkInsert.Providers.ProviderBase`2.Run[T](IEnumerable`1 entities)
at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, BulkInsertOptions options)
at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, SqlBulkCopyOptions sqlBulkCopyOptions, Nullable`1 batchSize)
at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, Nullable`1 batchSize)
at ADUtility.Logic.Task.GetDLAssociatesBeforeRunTask.<>c__DisplayClass1_0.<Execute>b__0(TP_DLs dl) in ...
任何人都可以提供有关为何发生这种情况的任何想法?
以下是我正在使用的代码:
var dlAssociatesBeforeRun = adHelper.GetDLAssociates(dl.DLName)
.Select(x =>
new TP_DLAssociatesBeforeRun
{
DLID = dl.ID,
ADUsername = x.ADUsername,
CreateDate = DateTime.Now,
CreateBy = "ADUtility.CLI",
UpdateDate = DateTime.Now,
UpdateBy = "ADUtility.CLI"
}).ToList();
_logger.Trace($"Detected {dlAssociatesBeforeRun.Count} for DL {dl.DLName}");
// ReSharper disable once InvertIf
if (dlAssociatesBeforeRun.Any())
{
db.BulkInsert(dlAssociatesBeforeRun);
db.SaveChanges();
下面是GetDLAssociates方法,它基本上只返回一个视图模型对象列表:
public List<DLAssociateViewModel> GetDLAssociates(string groupName, PrincipalContext context = null)
{
var dlAssociate = new List<DLAssociateViewModel>();
var group = GroupPrincipal.FindByIdentity(context ?? GlobalContext, groupName);
if (group == null)
{
throw new Exception("DL not found on Active Directory");
}
dlAssociate.AddRange(group.Members.OfType<UserPrincipal>()
.Select(member => new DLAssociateViewModel
{
DLName = groupName,
ADUsername = string.IsNullOrEmpty(member.EmployeeId) ? member.SamAccountName : member.EmployeeId,
}));
return dlAssociate;
}
答案 0 :(得分:0)
我面临着完全相同的问题。 我很确定它与一些静态属性有关,当我使用多个EF上下文时(我正在使用Parallel.ForEach并为每个线程创建专用的EF上下文)它会发生。
我使用ParallelOptions并发现当MaxDegreeOfParallelism == 1时,问题永远不会被复制。
所以,快速解决方法对我来说是: 在我的存储库构造函数中添加 Context.BulkInsert(new SomeEntity [0])( TP_DLAssociatesBeforeRun 而不是您的案例中的SomeEntity)。这就像'预热'并将正确初始化MappedDataReader(在EntityFramework BulkInsert-ef6-ext扩展中使用)。
顺便说一句,在BulkInsert之后你不需要 db.SaveChanges(); ,因为它直接在DB上执行。