2015-01-09 6 views
6

Ist es möglich, eine Eigenschaft automatisch zu inkrementieren, die nicht der Primärschlüssel in Entity Framework ist? Was ich habe, ist eine Klasse, die eine ID hat, sondern auch eine Seriennummer:Autoinkrement-Eigenschaft nicht Schlüssel

public class Maintenance 
{ 
    [Key] 
    public int ID { get; set; } 
    public int GroupID { get; set; } 
    public int SerialNo { get; set; } 
} 

Ich habe einen Index für GroupID und SerialNo mit einer einzigartigen Beziehung, was es unmöglich macht für eine Gruppe die gleiche Seriennummer haben zweimal .

Was ich gerade mache, überprüft .Max() für SerialNo innerhalb dieser Gruppe. Ich würde es aber gerne, wenn die Seriennummer automatisch inkrementiert würde. Ist das möglich?

Ich habe nach einer Lösung gesucht, aber soweit ich es verstehe, ist es nicht möglich, 2 automatisch inkrementierende Spalten mit Entitätsrahmen zu haben, und die automatisch inkrementierende Spalte wird immer die PK-Spalte sein.

Gibt es eine Möglichkeit, das automatische Inkrement einzustellen, oder gibt es eine bessere Lösung für das Problem als Max()? Die Verwendung von Max() kann theoretisch zwei Werte ergeben, die identisch sind und beim Versuch, das Programm einzufügen (aufgrund des eindeutigen Index), zum Absturz des Programms führen.

Ich verwende Code zuerst.

Um zu verdeutlichen: Ich möchte die ID als Primärschlüssel behalten und die Seriennummer beim Einfügen berechnen.

UPDATE:

Ich habe versucht mit [DatabaseGenerated(DatabaseGeneratedOption.Identity)] auf SerialNo, die in Entity Framework Ergebnisse wollen die Primärschlüssel, um diese Eigenschaft zu ändern. Ich versuchte auch [DatabaseGenerated(DatabaseGeneratedOption.Computed)], die versucht, NULL in die SerialNo Spalte und [DatabaseGenerated(DatabaseGeneratedOption.None)], die versucht, 0 einzufügen, im Grunde tun "nichts".

BEANTRAGT INFO:

Dies ist ein Beispiel dafür, wie die Tabelle aussehen könnte:

|_ID_|_GroupID_|_SerialNo_| 
| 1 | 1 | 1  | 
| 2 | 1 | 2  | 
| 3 | 2 | 1  | 
| 4 | 1 | 3  | 
| 5 | 2 | 2  | 
+2

Haben Sie eine Lösung für dieses finden benutzen? Ich habe die gleiche Frage/Problem ... – Mike

+0

Nein, sorry @ Mike tat ich nicht. Ich benutze immer noch '.Max()' –

Antwort

6

Ja, können Sie die following attribute verwenden:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int SerialNo { get; set; } 

Siehe für eine Liste von HERE mögliche Datenanmerkungen.

+2

Hallo, danke für den Link. Es wird sehr hilfreich sein. Mit 'DatabaseGenerationOption.Identity' wird 'SerialNo' zum Primärschlüssel für das Objekt, was ich nicht möchte.Ich möchte die ID als Primärschlüssel behalten und die Seriennummer beim Einfügen berechnen. –

+0

@RobinDorbell: 'Ich möchte die ID als Primärschlüssel behalten und die Seriennummer beim Einfügen berechnen. - Das ist absolut sinnvoll, aber nicht das, wonach Sie gefragt haben ;-). Vielleicht können Sie uns einige Beispiele geben, wie Ihre Zeilen aussehen sollten/können? – ChrFin

+1

Es ist 'DatabaseGeneratedOption' und nicht' DatabaseGenerationOption'. –

1

Wenn Sie SQL Server verwenden, als auch diese

Can we have more than one identity columns in a table.


So sorgfältig lesen denke ich unten Code kompilieren, aber erhalten Sie einen Fehler geben, wenn Datenbank zu migrieren/erstellen versuchen.

Sie können auch fließend api approch wie diese

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Maintenance>().Property(a => a.GroupID 
         ).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    modelBuilder.Entity<Maintenance>().Property(a => a.SerialNo 
         ).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
} 
Verwandte Themen