2013-08-07 13 views
5

Sto lavorando su un piccolo strumento di servizio per un database. Il mio problema è che a causa dell'ultimo aggiornamento, alcuni interstizi devono essere trasformati in numeri interi.Entity Framework Code First - Trasmetti smallint e intero a int32

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

} 

Ho cambiato il tipo da Int16 a int. Tutto funziona bene, tranne che non posso più usarlo con la vecchia versione del database. L'eccezione è qualcosa di simile a "System.Int32 atteso, trovato Typ System.Int16".

C'è un modo per eseguire il cast di intere e intere?

Qualche idea? Il mio ambiente: EntityFramework 5.0.0 .NET 4.5 FirebirdClient 3.0.2.0

ho cercato di forzare un cast nel ModelBuilder:

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

Eccezione:

errore 2019: Mappatura membro specificato è non valido. Il tipo 'Edm.Int32 [Nullable = False, DefaultValue =]' del membro 'ID' in Typ 'ContextRepository.TEST' non è compatibile con 'FirebirdClient.smallint [Nullable = False, DefaultValue =, StoreGeneratedPattern = Identity]' del membro 'SCHLUESSEL' nel tipo 'CodeFirstDatabaseSchema.BUNDLAND'

Fare il ID Int16 e poi colata di tutto per smallint (HasColumnType ("Int")) funziona bene, ma mi avrebbe dato eccezioni con i numeri più grandi di 31767 (max smallint) ...

+0

Perché non è possibile aggiornare il database per utilizzare INTEGER per questa colonna? –

+0

Sto solo scrivendo un programma di manutenzione e ho dubbi sugli effetti collaterali nell'applicazione principale ... – Dust258

risposta

7

Ho trovato una soluzione per il mio problema! Devo usare Int16 nel mio modello e utilizzare il ModelBuilder per impostare il Colum-tipo a 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); 
} 

ora posso lanciare la proprietà in int, senza eccezione (anche con i numeri> 32767):

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

Non capisco come si compila? Hai due proprietà con lo stesso nome. – michaelmsm89

+1

ups, risolto ora – Dust258

+0

Avete bisogno di HasColumnType ("SMALLINT")? Dichiarare int16 non è sufficiente? –