2016-12-02 3 views
1

Da EF keine Listen mit primitiven Typen speichern kann, habe ich ein Day-Objekt erstellt, das nur eine Enum von 1-7 enthält und die Methode migration seed zum Füllen der Datenbank verwendet. So in der Datenbank-Tabelle habe ich die Werte 1 bis 7.Verwenden von Listen primitiver Typen in EF

public class Day 
{ 
    [Key] 
    public Days DayOfWeek { get; set; } 

    public virtual ICollection<SalaryAddition> SalaryAdditions { get; set; } 
} 

Ich habe die Verbindung zwischen SalaryAddition und Tag in meinem OnModelCreating gesetzt.

modelBuilder.Entity<SalaryAddition>() 
    .HasMany(s => s.Days) 
    .WithMany(s => s.SalaryAdditions) 
    .Map(ss => 
    { 
     ss.MapLeftKey("SalaryAdditionId"); 
     ss.MapRightKey("SalaryAdditionDay"); 
     ss.ToTable("SalaryAdditionDays"); 
    }); 

Mein Problem ist, dass für mich einen Tag meines SalaryAddition Objekt hinzufügen ich es aus der Datenbank laden muß. Aber was ich will, ist nur etwas tun, wie folgt aus:

salaryAddition.Days.Add(new Day{DayOfWeek = Days.Monday}); 

Also brauche ich keine Nummer mit der Nummer aus der Datenbank zu laden.

Aber wenn dies zu tun, erhalte ich: Violation of PRIMARY KEY constraint 'PK_dbo.Days'. Cannot insert duplicate key in object 'dbo.Days'.

+1

Warum nicht eine Flagge Enum, wo jeden Tag als eine Potenz von 2 dargestellt wird, und speichern dass in "SalaryAddition" stattdessen, wie ich annehmen würde, Sie eine 'SalaryAddition' am selben Tag mehr als eine nicht zuordnen möchten. – juharr

+0

Das klingt genial! Aber wie würdest du es im Code machen? – Jeggy

+0

Ich denke, das ist ein großartiger Vorschlag, obwohl die Viele-zu-Viele auch Duplikate verhindern würden (jede Kombination 'SalaryAddition',' Day' ist einzigartig). –

Antwort

2

Besser ein Flag Enum verwenden Ich denke, würde in Ihrer SalaryAddition Klasse

[Flags] 
public enum DaysOfWeek 
{ 
    None = 0, 
    Monday = 1, 
    Tuesday = 2, 
    Wednesday = 4, 
    Thursday = 8, 
    Friday = 16, 
    Saturday = 32, 
    Sunday = 64, 
    All = 127 
} 

Dann würden Sie gerade haben

public DaysOfWeek Days { get; set; } 

Dann können Sie Sachen wie

tun
if(salaryAddition.Days.HasFlag(DaysOfWeek.Monday)) 
{ 
    Console.WriteLine("This salary addition is linked to Monday"); 
} 

Und die Fahne, um es für einen Tag eingestellt

salaryAddition.Days |= DaysOfWeek.Monday; 

Oder ungesetzt die Flagge

salaryAddition.Days &= ~DaysOfWeek.Monday; 
+0

Ich habe 'Flags' nie zuvor benutzt. Aber wie füge ich einen Tag zu einer DaysOfWeek enum hinzu? etwas wie "DaysOfWeek.Monday.Add (DaysOfWeek.Sunday)"? Ich kann sie nicht zusammen bringen. – Jeggy

+0

Ist dies 'var twowdays = DaysOfWeek.Monday | DaysOfWeek.Sunday' richtig? – Jeggy

+1

Ich habe den Code zum Setzen und unscharfschalten einzelner Flags hinzugefügt. – juharr

Verwandte Themen