Sembra che il supporto sia stato recentemente aggiunto a Entity Framework Core in .NET Core 2.1 (preview)
per consentire la mappatura delle colonne SQL_VARIANT
( https://github.com/aspnet/EntityFrameworkCore/issues/7043 ).
Sembra che il modo HasConversion()
per farlo sia usare il nuovo metodo HasConversion()
( https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions ).
Quindi, per mappare la mia colonna SQL_VARIANT
e trattare il tipo di dati sottostante come un VARCHAR
di qualsiasi lunghezza (mi interessa solo leggerlo a questo punto), posso fare quanto segue (dove la proprietà Value
qui è di tipo object
nel modello):
entity.Property(e => e.Value).HasConversion(v => v.ToString(),
v => v.ToString());
Funziona se il tipo di dati sottostante di SQL_VARIANT
è un VARCHAR
di qualsiasi lunghezza.
Tuttavia, essendo SQL_VARIANT
, la colonna potrebbe contenere dati di altri tipi, come i valori DATETIME
.
Per semplicità ho specificato solo DateTime
e string
qui, ma in teoria probabilmente vorrei supportare i tipi di dati necessari per mappare tutto ciò che potrebbe essere memorizzato in una colonna SQL_VARIANT
, se possibile.
Come farei per determinare quale di questi due tipi ( string
e DateTime
) vorrei mappare in fase di esecuzione? C'è un modo per fare questo?
A quanto ho capito, la strada da percorrere al momento è solo:
// where e.Value is property of type "object"
entity.Property(e => e.Value).HasColumnType("sql_variant");
E questo è tutto, non è necessario alcun convertitore personalizzato. Come messaggio pull aggiungendo questa funzione si afferma:
Il mappatore dei tipi ora mapperà le proprietà sulle colonne sql_variant se:
- La proprietà è tipo oggetto
- Il nome del tipo di negozio è specificato come sql_variant
Il codice corrente soddisfa la prima condizione (la proprietà è di tipo object
), ma non soddisfa la seconda. Perché esattamente non può dedurre il nome del tipo di negozio da proprietà di tipo oggetto - non ne sono davvero sicuro, forse solo perché Entity Framework non è specifico di SQL Server e supporta molti altri database, in cui la proprietà object
può avere semantica diversa o non supportata affatto, quindi richiede di esprimere esplicitamente le tue intenzioni.