Entity Framework Core 1.1.0數據類型轉換

c# entity-framework-core

我有一個遺留數據庫,用於存儲用戶註釋(以及其他一些文本字段)作為blob數據類型,我無法更改。

我正在編寫一個數據訪問層,在從數據庫中檢索數據時需要始終將數據轉換為string ,並在保存時將其轉換回blob

EF腳手架工具為這些實體生成了byte[]數據類型的屬性。

public byte[] Comment { get; set; }

我注意到,如果我只是將實體屬性類型更改為string它實際上會正確保存數據,但加載數據會導致轉換錯誤:

無法將類型為“System.Byte []”的對象強制轉換為“System.String”。

(有趣的是,版本1.0.0沒有拋出此錯誤,加載和保存工作正常。)

我的問題是......有沒有辦法配置EF核心,以便在我從數據庫中檢索數據時自動將此數據轉換為字符串,並在保存回來時返回blob ?或者我是否需要編寫一大堆私有getter和setter來進行這種操作?

一般承認的答案

除了我對你的回答的評論,如果你不想添加getter和setter並希望有乾淨的代碼,你也可以使用擴展方法:

public static class Extensions
{
    public static byte[] GetBytes(this string @this, System.Text.Encoding encoding = null)
    {
        return (encoding??Encoding.UTF8).GetBytes(@this);
    }

    public static string GetString(this byte[] @this, System.Text.Encoding encoding = null)
    {
        return (encoding??Encoding.UTF8).GetString(@this);
    }
}

你可以用這種方式與他們合作:

myentity.Comment = "my comment".GetBytes();
string comment = myentity.Comment.GetString();

處理代碼中的默認值,即UTF8,您可以將其更改為您要使用的編碼,或輸入其他編碼

byte[] myBytes = "my comment".GetBytes(Encoding.ASCII);

你的勝利:你不必使用byte[]為每個屬性指定一個getter / setter


熱門答案

byte[]轉換為string 始終需要Encoding 。由於EF不知道使用哪種編碼,因此無法進行這種自動轉換。

可以做的是將Comment屬性標記為私有,並創建一個包裝器屬性,將該值轉換為具有您選擇的Encoding的字符串:

partial class MyEntity
{
    private string m_commentText = null;
    public string CommentText
    {
        get {
            if ((m_commentText == null) && (Comment != null)) {
                m_commentText = Encoding.UTF8.GetString(Comment);      
            }
            return m_commentText;
        }
        set {
            m_commentText = value;
            if (value != null) {
                Comment = Encoding.UTF8.GetBytes(value);
            }
            else {
                Comment = null;
            }
        }
    }
}

此解決方案將文本存儲在backer字段中,以避免從byte[]string多次轉換。如果您需要將Comment屬性保持公開,則需要刪除backer字段以避免數據不一致:

partial class MyEntity
{
    public string CommentText
    {
        get {
            if (Comment != null) {
                return Encoding.UTF8.GetString(Comment);      
            }
            else {
                return null;
            }
        }
        set {
            if (value != null) {
                Comment = Encoding.UTF8.GetBytes(value);
            }
            else {
                Comment = null;
            }
        }
    }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因