Sto usando .NET Core 2.0
con Entity Framework Code First. Ho una tabella "HData" con questi pochi attributi: Id (PK), Valore (indice con ignorando l'impostazione della chiave duplicata) e Tempo. Questa tabella potrebbe contenere oltre 10.000.000 di voci.
Inserisco migliaia di voci come questa:
dataList.ForEach(i => db.HData.Add(new HData() { Value = i, Time = some.CreateDateTime }));
db.SaveChanges();
Ho già impostato IGNORE_DUP_KEY = ON
con il comando SQL, ma quando il codice viene eseguito fino a sopra db.SaveChanges
, mi viene mostrato il messaggio di errore duplicato come:
Impossibile inserire la riga chiave duplicata nell'oggetto 'dbo.HData' con l'indice univoco 'IX_HData_Value'. Il valore della chiave duplicata è (abcde).
Come posso risolverlo o comunque posso cogliere questa eccezione e saltare al prossimo inserimento dati?
Aggiorna informazioni sui modelli HData
public class HData
{
public int Id { get; set; }
public string Value { get; set; }
public DateTime Time { get; set; }
}
OnModelCreating:
builder.Entity<HData>(b => {
b.Property(p => p.Time).HasDefaultValueSql("GETUTCDATE()");
b.HasIndex(p => p.Value).IsUnique(true).HasFilter(null);});
3 ° aggiornamento:
Ho impostato IGNORE_DUP_KEY = ON
nella funzione EnsureSeedData
, il codice seguente
context.Database.ExecuteSqlCommand("ALTER INDEX [IX_HData_Value] ON [dbo].[HData] REBUILD WITH (IGNORE_DUP_KEY = ON)");
context.SaveChanges();
Se si desidera solo inserire i valori univoci, è possibile farlo
dataList.Distinct(l => l.value).ForEach(i => db.HData.Add(new HData() { Value = i, Time = some.CreateDateTime }));