如何使用Entity Framework Core保留字符串列表?

.net-core c# entity-framework entity-framework-core

讓我們假設我們有一個類如下所示:

public class Entity
{
    public IList<string> SomeListOfValues { get; set; }

    // Other code
}

現在,假設我們想要使用EF Core Code First來保持這一點,並且我們正在使用像SQL Server這樣的RDMBS。

一種可能的方法顯然是創建一個包裝字符串的包裝類Wraper

public class Wraper
{
    public int Id { get; set; }

    public string Value { get; set; }
}

並重構類,以便它現在依賴於Wraper對象列表。在這種情況下,EF將為Entity生成一個表,為Wraper生成一個表並建立“一對多”關係:對於每個實體,都有一堆包裝器。

雖然這有效,但我不太喜歡這種方法,因為我們正在改變一個非常簡單的模型,因為持久性問題。確實,只考慮領域模型和代碼,沒有持久性, Wraper類在那裡毫無意義。

有沒有其他方法使用EF Core Code First將一個帶有字符串列表的實體持久保存到RDBMS而不是創建一個包裝類?當然,最後必須完成同樣的事情:必須創建另一個表來保存字符串,並且必須建立“一對多”關係。我只想用EF Core做這個,而不需要在域模型中編寫包裝類。

熱門答案

從Entity Framework Core 2.1開始,這可以通過更簡單的方式實現。 EF現在支持Value Conversions以專門解決這樣的場景,其中屬性需要映射到不同的存儲類型。

要保留字符串集合,可以按以下方式設置DbContext

protected override void OnModelCreating(ModelBuilder builder)
{
    var splitStringConverter = new ValueConverter<IEnumerable<string>, string>(v => string.Join(";", v), v => v.Split(new[] { ';' }));
    builder.Entity<Entity>().Property(nameof(Entity.SomeListOfValues)).HasConversion(splitStringConverter);
} 

請注意,此解決方案不會因數據庫問題而破壞您的業務類。

不用說,這個解決方案,必須確保字符串不能包含分隔符。但是,當然,任何自定義邏輯都可用於進行轉換(例如從/到JSON的轉換)。

另一個有趣的事實是,null值不會傳遞給轉換例程,而是由框架本身處理。因此,不需要擔心空檢查。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow