我正在将数据从CSV文件导入SQL Server DB,该CSV可能包含重复的条目。
我现有的代码使用SqlBulkCopy()和“ IGNORE_DUP_KEY = ON”,所有重复都很好。
我首先要使用EF Core和Zzz Projects实体框架扩展切换到代码。
主键在DbContext中定义:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (modelBuilder == null)
throw new ArgumentNullException(nameof(modelBuilder));
modelBuilder.Entity<AmbientWeatherData>()
.HasKey(u => new { u.TimeStamp });
modelBuilder.Entity<ApcUpsData>()
.HasKey(u => new { u.TimeStamp });
modelBuilder.Entity<PurpleAirData>()
.HasKey(u => new { u.TimeStamp });
modelBuilder.Entity<Vr1710Data>()
.HasKey(u => new { u.TimeStamp });
modelBuilder.Entity<Vr1710EventData>()
.HasKey(u => new { u.TimeStamp, u.Type });
modelBuilder.Entity<WeatherGooseData>()
.HasKey(u => new { u.TimeStamp });
modelBuilder.Entity<WundergroundData>()
.HasKey(u => new { u.TimeStamp });
modelBuilder.Entity<WundergroundDailyData>()
.HasKey(u => new { u.TimeStamp });
}
使用BulkInsert插入数据:
dbContext.BulkInsert(data, options => options.AllowDuplicateKeys = true);
插入重复项时出现异常:
Microsoft.Data.SqlClient.SqlException(0x80131904):违反主键约束'PK_Vr1710Data'。无法在对象“ dbo.Vr1710Data”中插入重复密钥。重复的键值为(2014-12-28 14:26:07.0000000)。
插入数据的函数是通用的,并且与类型无关。
public static bool Import<TDataType, TLoaderType, TConfigType>(string fileName, string connectionString)
where TLoaderType : TelemetryLoader<TDataType, TConfigType>, new()
where TConfigType : TelemetryConfig
where TDataType : TelemetryData
{
// ...
}
BulkInsert()
和AllowDuplicateKeys
的在线示例要求使用ColumnPrimaryKeyExpression
发件人:https://entityframework-extensions.net/bulk-insert#insert-only-if-the-entity-not-already-exists
context.BulkInsert(customers, options => {
options.InsertIfNotExists = true;
options.ColumnPrimaryKeyExpression = c => c.Code;
});
如何在不需要为每种数据类型专门化ColumnPrimaryKeyExpression
的情况下忽略重复项,而是使用DbContext中定义的密钥?
参考方案
如何在不需要每种数据类型都专门化ColumnPrimaryKeyExpression的情况下忽略重复项,而是使用DbContext中定义的键?
默认情况下,库已从DbContext
获取密钥。
在示例中,c.Code
代表自定义键(CustomerID
是实键)。
如果我正确理解问题,则需要使用以下代码:
context.BulkInsert(customers, options => {
options.InsertIfNotExists = true;
options.AllowDuplicateKeys = true;
});
这两个选项都是必需的。
使用Entity Framework Core(2.1)调用标量函数的最佳实践 - c#我经常需要从Web应用程序(ASP.NET Core / EF Core)中调用在SQL Server上定义的标量函数。由于这些函数只是简单的辅助函数,因此我也使用了许多辅助函数,因此我使用了通用模式来调用这些标量函数-借助EF Core 2.1可用的新查询类型。由于我是EF Core的新手,所以我的问题是这种模式是否会引起问题,并且/或者是否存在调用标量函…
Entity Framework DbEntityEntry>'不包含Where的定义 - c#此代码狙击手来自Adding CreatedDate to an entity using Entity Framework 5 Code First public override int SaveChanges() { DateTime saveTime = DateTime.Now; foreach (var entry in this.ChangeT…
剃刀付款集成->如何通过关闭按钮X检测剃刀付款模型是否关闭 - javascript当用户关闭而无需付款时,我在CI框架中使用Razorpay,请创建razor支付模型,然后取消订单,我希望按状态更改为已取消的状态触发查询。所以我怎么能检测到这一点。我已经通过单击jQuery单击关闭功能但无法使用... javascript大神给出的解决方案 Razorpay提供了JS方法来检测模式关闭。您编写的任何JS代码都不会在结帐页面上运行,因为它是…
如何使用箭头符号(->)创建受保护的方法? - java当我们编写以下代码时Stream.of(1,2,3,4,5).filter(i -> (i%2 == 0)).map( i -> i*i ); 表达式i -> (i%2 == 0)或i -> i*i将变为私有方法。在我的用例中,编写了一个junit测试,以确保没有方法是私有的(是的,这是强制性的),并且对于这些lambda表达式而言,…
粗糙的Unicode->没有CLDR的语言代码? - javascript我在写字典应用。如果用户键入Unicode字符,我想检查该字符是哪种语言。例如字 - returns ['zh', 'ja', 'ko'] العربية - returns ['ar'] a - returns ['en', 'fr', …