我正在 ASP.NET Core 中开发 Web API,我们发现自己需要为大型批量插入操作运行后台任务。然而,我插入的模型包含
Geometry
类型的属性,来自 .NET Topology Suite。
public class GeometricData
{
//...
public Geometry Geometry { get; set; }
}
为了批量插入,我正在遵循我在here 中找到的方法,它非常有效,但它的实现超出了这个问题的范围。尽管速度很快,但例如,用户可能会一次性插入超过一百万条记录,因此我们决定将此处理转移到后台任务。 Hangfire 扩展起初看起来可以为我们节省很多时间,但它似乎不能很好地处理
Geometry
类型。在下面的代码中,BackgroundTask
方法也可能是一个空方法:
public Task BulkInsert(IEnumerable<GeometricData> list)
{
BackgroundJob.Enqueue(() => BackgroundTask(list));
return Task.CompletedTask;
}
只是在
Geometry
的操作中将 BackgroundTask
的列表作为参数传递给 Enqueue
的行为将抛出不幸的错误:
Self referencing loop detected for property 'CoordinateValue' with type 'NetTopologySuite.Geometries.Coordinate'. Path '[0].Geometry.Coordinates[0]'.
事实上,
Coordinates
(NTS类)确实引用了自己:
不知道他们为什么要那样做,但他们做到了。无论如何,到目前为止一切都很好,但除非我设法找到解决这个问题的方法(或者甚至可能绕过它),否则我将从头开始实施后台工作人员会遇到很多麻烦(我'我们将使用 Worker Service,以防万一有人想知道)。有什么指示吗?
Man,在几何和坐标上方添加 JsonIgnoreAttribute,另外:检查以下链接:newtonsoft.com/json/help/html/PropertyJsonIgnore.htm
Hangfire 将尝试序列化传递给函数的任何参数,以便它可以在任何重复作业期间重播它。我假设您正在使用类似这样的方法:
RecurringJob.AddOrUpdate("test", () => BulkInsert(theList), Cron.Minutely);
相反,如果可能的话,尝试访问函数内的列表,这样 Hangfire 就不会序列化它。
RecurringJob.AddOrUpdate("test", () => BulkInsert(), Cron.Minutely);
public Task BulkInsert()
{
var list = <theListFromSomewhere>;
BackgroundJob.Enqueue(() => BackgroundTask(list));
return Task.CompletedTask;
}