2015-01-09 10 views
6

Czy możliwe jest automatyczne zwiększenie właściwości, która nie jest kluczem podstawowym w Entity Framework? Co muszę to klasa, która ma identyfikator, ale również numer seryjny:Właściwość automatycznej inkrementacji bez klucza

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

Mam indeks na GroupID i SerialNo z unikalnym stosunku, uniemożliwiając grupa może mieć taki sam numer seryjny dwukrotnie .

Co obecnie robię, sprawdzam w tej grupie .Max() dla SerialNo. Chciałbym jednak, żeby numer seryjny został automatycznie zwiększony. czy to możliwe?

Szukałem rozwiązania, ale o ile rozumiem, nie jest możliwe posiadanie dwóch automatycznych inkrementacji kolumn ze strukturą encji, a kolumną automatycznej inkrementacji zawsze będzie kolumna PK.

Czy istnieje sposób ustawienia automatycznej inkrementacji, czy jest lepsze rozwiązanie problemu niż użycie Max()? Korzystanie z Max() może teoretycznie wytworzyć 2 wartości, które są identyczne i spowoduje awarię programu podczas próby wstawienia (z powodu unikalnego indeksu).

Najpierw używam kodu.

Aby wyjaśnić: Chcę zachować identyfikator jako klucz podstawowy i obliczyć numer seryjny podczas wstawiania.

UPDATE:

Próbowałem za pomocą [DatabaseGenerated(DatabaseGeneratedOption.Identity)] na SerialNo co skutkuje Entity Framework chce zmienić klucz podstawowy dla tej nieruchomości. Próbowałem również [DatabaseGenerated(DatabaseGeneratedOption.Computed)], który próbuje wstawić NULL do kolumny SerialNo, a [DatabaseGenerated(DatabaseGeneratedOption.None)], który próbuje wstawić 0, zasadniczo robi "nic".

WNIOSEK INFO:

Jest to przykład na to, jak tabela może wyglądać:

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

Znalazłeś rozwiązanie tego? Mam to samo pytanie/problem ... – Mike

+0

Nie, przepraszam, @Mike, którego nie zrobiłem. Nadal używam '.Max()' –

Odpowiedz

6

Tak, można użyć following attribute:

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

Zobacz HERE do listy możliwe adnotacje danych.

+2

Witam, dziękuję za link. Będzie to bardzo pomocne. Użycie 'DatabaseGenerationOption.Identity' wymusi, że' SerialNo' stanie się kluczem podstawowym dla obiektu, co nie jest tym, czego chcę.Chcę zachować ID jako klucz podstawowy i obliczyć numer seryjny podczas wstawiania. –

+0

@RobinDorbell: 'Chcę zachować ID jako klucz podstawowy i obliczyć numer seryjny podczas wstawiania." - to ma sens, ale nie jest tym, o co prosiłeś ;-). Może możesz podać nam kilka przykładów, jak powinny wyglądać twoje wiersze? – ChrFin

+1

To 'DatabaseGeneratedOption', a nie' DatabaseGenerationOption'. –

1

Jeśli używasz serwera sql niż również przeczytać uważnie

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


więc myślę kompilacji kodu poniżej, ale daje błąd podczas próby migrować/utworzyć bazę danych.

można również użyć biegle api approch jak ten

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); 
} 
Powiązane problemy