如何使用实体框架扩展BulkInsert和AllowDuplicateKeys - c#

我正在将数据从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', …