Entity Frameworkコア1.1.0データ型変換

c# entity-framework-core

質問

私は、変更することはできませんblobデータ型として、ユーザーのコメント(および他のテキストフィールドのかなりの)を格納するレガシーデータベースを持っています。

私は、データベースから取得されたときに常にデータをstringに変換し、保存するときにそれをblobに戻す必要があるデータアクセス層を作成していstring

EFスカフォールディングツールは、これらのエンティティのbyte[]データ型としてプロパティを生成しました。

public byte[] Comment { get; set; }

実際にエンティティのプロパティの型をstringに変更すると、実際にはデータが正しく保存されますが、データを読み込むとキャストエラーが発生することに気付きました。

型 'System.Byte []'のオブジェクトを型 'System.String'にキャストできません。

(興味深いことに、バージョン1.0.0ではこのエラーは発生しませんでした。ロードと保存は正常でした)。

私の質問は...データベースから取得したときにこのデータを文字列に自動的に変換し、保存されたときにblobに戻すようにEFコアを設定する方法はありますか?あるいは、私はこの操作を行うためにプライベートゲッターとセッターをたくさん書く必要がありますか?

受け入れられた回答

あなたの返答に対する私のコメントに加えて、getterとsetterを追加したくないし、クリーンなコードを望むなら、あなたはextension-methodsで作業することもできます:

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は使用するエンコーディングを認識しないため、このような自動変換は不可能です。

何あなたがができることは民間としてあなたのコメントプロパティをマークするとの文字列に値を変換ラッパープロパティを作成することです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;
            }
        }
    }
}

このソリューションは、テキストをバッカーフィールドに格納し、 byte[]からstringへの複数回の変換を回避しstring 。公開するためにCommentプロパティが必要な場合は、データの不一致を避けるためにバッカーフィールドを削除する必要があります。

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は合法ですか? はい、理由を学ぶ