2013-02-11 3 views
7

Sto utilizzando Entity Framework 5 - Codice prima.Come mappare la colonna e l'entità appropriata di diversi tipi di dati nel codice del framework di entità prima

Ho un database a cui mi sto collegando che esiste già da un po 'di tempo (non l'ho creato). C'è un tavolo chiamato T_Customers. Contiene un elenco di tutti i clienti. Essa ha la seguente struttura (solo parzialmente illustrato):

Customer_id | numeric (5, 0) | auto increment | not null (not set as primary key) 
FName | varchar(50) | not null 
LName | varchar(50) | not null 

mio Customer classe:

public class Customer : IEntity 
{ 
    public int Id { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 

mio IEntity interfaccia:

public interface IEntity 
{ 
    int Id { get; set; } 
} 

Ho il seguente nella mia classe contesto di database:

public class DatabaseContext : DbContext 
{ 
    public DatabaseContext(string connectionString) 
      : base(connectionString) 
    { 
    } 

    public DbSet<Customer> Customers { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
      modelBuilder.Configurations.Add(new CustomerConfiguration()); 
    } 

    public new DbSet<TEntity> Set<TEntity>() 
      where TEntity : class, IEntity 
    { 
      return base.Set<TEntity>(); 
    } 
} 

La mia classe di configurazione del cliente:

class CustomerConfiguration : EntityTypeConfiguration<Customer> 
{ 
    internal CustomerConfiguration() 
    { 
      this.ToTable("T_Customers"); 
      this.Property(x => x.Id).HasColumnName("Customer_id"); 
      this.Property(x => x.FirstName).HasColumnName("FName"); 
      this.Property(x => x.LastName).HasColumnName("LName"); 
    } 
} 

Sto cercando di essere coerente nelle mie dichiarazioni di entità, ho bisogno di tutti gli ID di essere interi. Questo ID cliente è di tipo numerico nel database e ora sto riscontrando problemi quando tento di restituire un elenco di tutti i clienti. Come faccio a mappare da un tipo numerico di database a un tipo intero C#? Non sto cambiando l'ID della mia classe a valori nulli o decimali, i miei ID sono sempre non annullabili e interi. Inoltre non posso modificare il database.

L'errore che sto ottenendo è:

The 'Id' property on 'Customer' could not be set to a 'Decimal' value. 
You must set this property to a non-null value of type 'Int32'. 

risposta

6

specificare il tipo numerico per la colonna

Property(x => x.Id).HasColumnName("Customer_id").HasColumnType("numeric"); 

Durante la generazione di database, creerà colonna numerica con precisione 18,0. Ma quando si esegue il mapping al database esistente, funzionerà correttamente con la colonna numerica 5,0.

+0

Grazie. Cosa succede se ho bisogno di una precisione diversa che 18, 0? È meglio attenersi alla precisione di 5,0? –

+0

@BrendanVogt bene, hai detto che hai già un database esistente, quindi il tuo '5.0' di precisione rimarrà. Se genererai un nuovo database dal codice, questa colonna avrà la precisione '18,0'. Quindi, se hai già precisione '5,0', non devi modificare nulla. Il numero intero BTW potrebbe avere un valore superiore a 99999, quindi è importante. –

+1

Grazie! Mi ha cambiato la giornata in positivo. – tuseau

-2

È possibile convertirlo in un int con:

int myInt = Convert.Int32(numberFromDatabase); 
3

La soluzione più semplice è quello di utilizzare un altro campo che verrà mappato al database campo, e la proprietà ID leggerà/scriverà in questo campo. Qualcosa di simile a questo:

public class Customer : IEntity 
{ 
    public decimal CustomerID {get; set;} 

    [NotMapped] 
    public int Id 
    { 
     get { return (int)CustomerID; } 
     set { CustomerID = (int)value; } 
    } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 

Mappa questo nuovo campo per il campo del database, utilizzando

this.Property(x => x.CustomerID).HasColumnName("Customer_id"); 

e l'EF utilizzeranno il campo ID cliente e il codice potrebbe tranquillamente utilizzare il campo intero id.

-1

Un'altra opzione di capire cosa il codice prima dovrebbe essere è quello di MS EF Powertools http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

È possibile aggiungere un progetto vuoto, fare clic destro, EF codice tecnico Reverse prima dal DB.

Spesso (non sempre) si ottiene un buon inizio della soluzione. Hai provato a utilizzare il decimale?

public class Customer : IEntity 
{ 
public decimal Id { get; set; } 

public string FirstName { get; set; } 

public string LastName { get; set; } 
} 

se si è interessati alla precisione, è necessario aggiungere la convalida al POCO.

Ci sono anche alcuni hack di Anotation interessanti che potrebbero piacerti. http://geekswithblogs.net/danemorgridge/archive/2010/12/20/ef4-code-first-control-unicode-and-decimal-precision-scale-with.aspx buona fortuna