[โซลูชั่นใหม่สำหรับ POSTGRESQL] เฮ้ฉันรู้ว่ามันค่อนข้างโพสต์เก่า แต่เมื่อเร็ว ๆ นี้ฉันพบปัญหาที่คล้ายกัน แต่เราใช้ Postgresql ฉันต้องการใช้กลุ่มเอกสารที่มีประสิทธิภาพสิ่งที่กลายเป็นเรื่องยาก ฉันไม่ได้พบห้องสมุดฟรีที่เหมาะสมที่จะทำในฐานข้อมูลนี้ ฉันพบผู้ช่วยนี้เท่านั้น:
https://bytefish.de/blog/postgresql_bulk_insert/
ซึ่งอยู่ใน Nuget ด้วย ฉันได้เขียน mapper ขนาดเล็กซึ่งคุณสมบัติการแมปอัตโนมัติวิธี 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;
}
ฉันใช้วิธีต่อไปนี้ (ฉันมีเอนทิตีที่ชื่อ Undertaking):
var undertakingHelper = BulkMapper.CreateHelper<Model.Undertaking>("dbo", nameof(Model.Undertaking));
undertakingHelper.SaveAll(transaction.UnderlyingTransaction.Connection as Npgsql.NpgsqlConnection, undertakingsToAdd));
ฉันแสดงตัวอย่างพร้อมธุรกรรม แต่ก็สามารถทำได้ด้วยการเชื่อมต่อปกติที่ดึงมาจากบริบท undertakingsTo เพิ่มเป็นจำนวนมากของเอนทิตีบันทึกปกติซึ่งฉันต้องการ bulkInsert ลงในฐานข้อมูล
วิธีแก้ปัญหานี้ซึ่งฉันได้รับหลังจากการค้นคว้าและทดลองใช้ไม่กี่ชั่วโมงนั้นเป็นไปตามที่คุณคาดหวังได้เร็วกว่าและในที่สุดใช้งานง่ายและฟรี! ฉันแนะนำให้คุณใช้โซลูชันนี้จริงๆไม่เพียง แต่ด้วยเหตุผลที่กล่าวถึงข้างต้น แต่ยังเป็นเพราะเป็นโปรแกรมเดียวที่ฉันไม่มีปัญหากับ Postgresql เองโซลูชันอื่น ๆ อีกมากมายทำงานได้อย่างไร้ที่ติเช่น SqlServer