2013-08-07 16 views
5

Pracuję na małym narzędziu do obsługi bazy danych. Mój problem polega na tym, że z powodu ostatniej aktualizacji niektóre smallint-colums musiały zostać zmienione na integer.Entity Framework Code First - Przesyłaj smallint i integer do int32

public class TEST 
{ 
    public int ID { get; set; } 
    //public Int16 ID { get; set; } 
    public string TEST { get; set; } 

} 

Zmieniłem typ z Int16 na int. Wszystko działa dobrze, z tym wyjątkiem, że nie mogę go już używać ze starą wersją bazy danych. Wyjątek jest podobny do "System.Int32 spodziewany, znaleziony Typ System.Int16".

Czy istnieje sposób, aby rzucić wszystkie smallint i integer na int32?

Wszelkie pomysły? Moja okolica: EntityFramework 5.0.0 .NET 4.5 FirebirdClient 3.0.2.0

próbowałem wymusić oddanych w ModelBuilder:

 modelBuilder.Entity<TEST>() 
     .Property(p => p.ID) 
     .HasColumnType("smallint"); 

Wyjątek:

Błąd 2019: Mapowanie Użytkownik jest określony nieważny. Typ 'Edm.Int32 [Nullable = False, DefaultValue =]' elementu 'ID' w Typ 'ContextRepository.TEST' nie jest zgodny z 'FirebirdClient.smallint [Nullable = False, DefaultValue =, StoreGeneratedPattern = Identity]' elementu 'Schluessel' typu 'CodeFirstDatabaseSchema.BUNDLAND'

podjęciu ID Int16, a następnie rzucając wszystko smallint (HasColumnType ("int")) działa bez zarzutu, ale dałby mi wyjątki z liczb większych niż 31767 (smallint max) ...

+0

Dlaczego nie można uaktualnić bazy danych do użycia INTEGER dla tej kolumny? –

+0

Piszę tylko program konserwacji i mam obawy o skutki uboczne w głównej aplikacji ... – Dust258

Odpowiedz

7

Znalazłem rozwiązanie dla mojego problemu! Muszę używać Int16 w moim modelu i używać ModelBuilder ustawić colum typu do Smallint:

public class TEST 
{ 
    public Int16 ID { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<TEST>().HasKey(a => new { a.ID}); 
    modelBuilder.Entity<TEST>() 
    .Property(p => p.ID) 
    .HasColumnType("SMALLINT"); 
    base.OnModelCreating(modelBuilder); 
} 

Teraz mogę rzucać właściwość int bez wyjątku (nawet z numerami> 32767):

var lQry = (from b in ctData.TEST 
    select new 
    { 
     ID = (int)b.ID, 
    }); 
+0

Nie rozumiem, jak to kompiluje? Masz dwie właściwości o tej samej nazwie. – michaelmsm89

+1

ups, naprawiono teraz – Dust258

+0

Czy potrzebujesz HasColumnType ("SMALLINT")? Czy deklaracja int16 nie wystarczy? –

Powiązane problemy