Stiamo utilizzando Entity Framework 6 per creare un livello dati su un database Sql Server legacy con colonne Id di tipo bigint
. Vogliamo utilizzare int
per i nostri tipi di colonne Id piuttosto che long
e siamo sicuri che le tabelle non cresceranno mai oltre il limite di dimensioni di un int
.
Tuttavia, stiamo ricevendo il seguente errore:
Il cast specificato da un tipo 'System.Int64' materializzato al tipo 'System.Int32' non è valido.
Come possiamo ottenere ciò che vogliamo senza modificare il tipo di colonna db?
Dovresti essere in grado di specificare il DataType della colonna nel tuo metodo OnModelCreating
per ogni modello interessato):
modelBuilder.Entity<Department>()
.Property(p => p.Id)
.HasColumnType("bigint");
Se ogni ID in ogni modello è associato a un bigint
, è possibile utilizzare una convenzione personalizzata:
modelBuilder.Properties<int>()
.Where(p => p.Name == "Id")
.Configure(c => c.HasColumnType("bigint"));
Un'altra tecnica sarebbe quella di utilizzare una classe base astratta per tutti i modelli che hanno un Id
bigint
(e questo esempio mostra l'annotazione dei dati invece dell'API fluente:
public abstract class BaseModel
{
[Column(TypeName="bigint")]
public int Id { get; set; }
}
Riferimenti:
Che dire di qualcosa del genere:
class DbEntity
{
[Key]
private Int64 Id { get; set; }
[NotMapped]
public int SmallerId {
get { return Convert.ToInt32(Id); }
}
}
Questa strategia può essere utilizzata per tutti i tipi di mapping, come Sì / No a vero / falso, vedere questa domanda