[英]How do you properly handle SQL_VARIANT in Entity Framework Core?
看起來最近在.NET Core 2.1 (preview)
向Entity Framework Core添加了支持,以允許映射SQL_VARIANT
列( https://github.com/aspnet/EntityFrameworkCore/issues/7043 )。
看起來這樣做的方法是使用新的HasConversion()
方法( https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions )。
因此,為了映射我的SQL_VARIANT
列並將基礎數據類型視為任何長度的VARCHAR
(我只關心此時讀取它),我可以執行以下操作(其中Value
屬性的類型為object
模型):
entity.Property(e => e.Value).HasConversion(v => v.ToString(),
v => v.ToString());
如果SQL_VARIANT
的基礎數據類型是任何長度的VARCHAR
,則此方法有效。
但是,作為SQL_VARIANT
,該列可以包含其他類型的數據,例如DATETIME
值。
為簡單起見,我在這里只指定了DateTime
和string
,但理論上我可能希望支持映射SQL_VARIANT
列中存儲的所有數據類型,如果可能的話。
我將如何確定在運行時我想要映射到的這兩種類型中的哪一種( string
和DateTime
)? 有沒有辦法做到這一點?
據我了解,目前的方法是:
// where e.Value is property of type "object"
entity.Property(e => e.Value).HasColumnType("sql_variant");
這就是全部,不需要任何自定義轉換器。 添加此功能的拉消息說明:
現在,類型映射器將屬性映射到sql_variant列,如果:
- 該屬性是類型對象
- 商店類型名稱指定為sql_variant
您當前的代碼滿足第一個條件(屬性是object
類型),但不滿足第二個條件。 為什么它不能從屬性類型對象的屬性推斷存儲類型名稱 - 我不太確定,可能只是因為實體框架不是特定於sql-server並且支持許多其他數據庫,其中object
屬性可以具有不同的語義或不支持所以,它需要明確說明你的意圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.