2016-02-17 25 views
8

Sto tentando di effettuare il seeding di un database utilizzando il metodo context.AddOrUpdate, ma il problema è che è necessario rendere i dati inseriti univoci in base a un indice a più colonne.Entity Framework - Seed AddOrUpdate con indice multi colonna come identificatore

[Table("climbing_grades")] 
public class ClimbingGrade : EntityBase 
{ 
    /// <summary> 
    /// The name of the climbing grade, e.g.: 7a, VII, etc. 
    /// </summary> 
    [Index("IX_Name_GradeType", 1, IsUnique = true)] 
    public string Name { get; set; } 

    /// <summary> 
    /// Tries to display the average difficulty of the described grade. 
    /// Matching the different grades can be difficult because its always 
    /// a subjective rating and there exists no norm on converting grades. 
    /// </summary> 
    public double Difficulty { get; set; } 

    /// <summary> 
    /// The type of the grade. Will be the respective region rating. 
    /// e.g.: UUIA for most oft europe, YSD for USA, etc. 
    /// </summary> 
    [Index("IX_Name_GradeType", 2, IsUnique = true)] 
    public ClimbingGradeType GradeType { get; set; } 
} 

Attualmente mi AddOrUpdate basa sulla Name del grado di arrampicata, ma ora sono a un punto in cui ho bisogno di inserire i nomi duplicati.

context.ClimbingGrades.AddOrUpdate(grade => /* Compare multi column index here?*/, 
    new ClimbingGrade 
    { 
     Name = "5a", 
     Difficulty = 4.75, 
     GradeType = ClimbingGradeType.FontainebleauBloc 
    }, 
    new ClimbingGrade 
    { 
     Name = "5a", 
     Difficulty = 4.25, 
     GradeType = ClimbingGradeType.FontainebleauTraverse 
    }); 

È possibile confrontare gli indici a più colonne quando inserisco i dati seme?

+0

Cosa intendi per "è possibile confrontare ...?" Cosa vuoi esattamente fare? Vuoi mantenere solo alcuni dei possibili valori ripetuti? – JotaBe

+1

Desidero utilizzare l'indice multi colonna come riferimento se il set di dati esiste già nel database. ad es .: '.AddOrUpdate (grade => grade.Name == existing.Name && grade.GradeType == existing.GradeType)' – Silthus

risposta

7

È necessario utilizzare il tipo anonimo per specificare più colonne. Questo funziona anche senza specificare gli indici.

context.ClimbingGrades.AddOrUpdate(grade => new { grade.Name, grade.GradeType }, 
    new ClimbingGrade 
    { 
     Name = "5a", 
     Difficulty = 4.75, 
     GradeType = ClimbingGradeType.FontainebleauBloc 
    }, 
    new ClimbingGrade 
    { 
     Name = "5a", 
     Difficulty = 4.25, 
     GradeType = ClimbingGradeType.FontainebleauTraverse 
    });