[GIẢI PHÁP MỚI CHO POSTGRESQL] Này, tôi biết đó là một bài viết khá cũ, nhưng gần đây tôi đã gặp phải vấn đề tương tự, nhưng chúng tôi đã sử dụng Postgresql. Tôi muốn sử dụng bulkinsert hiệu quả, điều này hóa ra khá khó khăn. Tôi chưa tìm thấy bất kỳ thư viện miễn phí thích hợp nào để làm như vậy trên DB này. Tôi chỉ tìm thấy người trợ giúp này:
https://bytefish.de/blog/postgresql_bulk_insert/
cũng có trên Nuget. Tôi đã viết một trình ánh xạ nhỏ, tự động ánh xạ các thuộc tính theo cách Entity Framework:
public static PostgreSQLCopyHelper<T> CreateHelper<T>(string schemaName, string tableName)
{
var helper = new PostgreSQLCopyHelper<T>("dbo", "\"" + tableName + "\"");
var properties = typeof(T).GetProperties();
foreach(var prop in properties)
{
var type = prop.PropertyType;
if (Attribute.IsDefined(prop, typeof(KeyAttribute)) || Attribute.IsDefined(prop, typeof(ForeignKeyAttribute)))
continue;
switch (type)
{
case Type intType when intType == typeof(int) || intType == typeof(int?):
{
helper = helper.MapInteger("\"" + prop.Name + "\"", x => (int?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type stringType when stringType == typeof(string):
{
helper = helper.MapText("\"" + prop.Name + "\"", x => (string)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type dateType when dateType == typeof(DateTime) || dateType == typeof(DateTime?):
{
helper = helper.MapTimeStamp("\"" + prop.Name + "\"", x => (DateTime?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type decimalType when decimalType == typeof(decimal) || decimalType == typeof(decimal?):
{
helper = helper.MapMoney("\"" + prop.Name + "\"", x => (decimal?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type doubleType when doubleType == typeof(double) || doubleType == typeof(double?):
{
helper = helper.MapDouble("\"" + prop.Name + "\"", x => (double?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type floatType when floatType == typeof(float) || floatType == typeof(float?):
{
helper = helper.MapReal("\"" + prop.Name + "\"", x => (float?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type guidType when guidType == typeof(Guid):
{
helper = helper.MapUUID("\"" + prop.Name + "\"", x => (Guid)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
}
}
return helper;
}
Tôi sử dụng nó theo cách sau (tôi có thực thể tên là Cam kết):
var undertakingHelper = BulkMapper.CreateHelper<Model.Undertaking>("dbo", nameof(Model.Undertaking));
undertakingHelper.SaveAll(transaction.UnderlyingTransaction.Connection as Npgsql.NpgsqlConnection, undertakingsToAdd));
Tôi đã đưa ra một ví dụ với giao dịch, nhưng nó cũng có thể được thực hiện với kết nối bình thường được lấy từ ngữ cảnh. undertakingsToAdd là vô số các bản ghi thực thể bình thường, mà tôi muốn đưa hàng loạt vào DB.
Giải pháp này, mà tôi đã nhận được sau vài giờ nghiên cứu và thử, là vì bạn có thể mong đợi nhanh hơn nhiều và cuối cùng dễ sử dụng và miễn phí! Tôi thực sự khuyên bạn nên sử dụng giải pháp này, không chỉ vì những lý do nêu trên mà còn bởi vì đó là giải pháp duy nhất mà tôi không gặp vấn đề gì với chính Postgresql, nhiều giải pháp khác hoạt động hoàn hảo, ví dụ như với SqlServer.