C# - Entity Framework - ネストされた JSON オブジェクトを含むレコードのストアド プロシージャ呼び出し: 逆シリアル化の処理方法

okwaves2024-01-24  6

環境:

<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer"バージョン = "3.1.7" /> SQLサーバー2016 .NETコア3.1

データベーステーブル:

Id (Primary key)  
Settings (nvarchar(max) contains the nested json)  
DateCreated datetime  
DateModified datetime  

C# で次の EF 動的呼び出しを使用しています。

return Context.Set<T>().FromSqlRaw($"EXEC {spName}").ToList();

逆シリアル化する C# オブジェクト:

public class UserSetting
{
    public int ID { get; set; }
    public MyClass SettingData { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime? DateModified { get; set; }

    public class MyClass
    {
        public string MyProperty { get; set; }
    }
}

遭遇したエラー:

MyClass はキーレスである必要があります

それを修正すると、別のエラーが発生します:

UserSetting と MyClass の間には関係がありません

Entity Framework が UserSetting クラスのプロパティ SettingData の MyClass 型を自動的に逆シリアル化することは可能ですか?

更新

{
  "MyClass": {
    "MyProperty": "Hello World"
  }
}  

アップデート 2 SettingData プロパティのみのデータベース テーブルの更新をテストしています。SQL Server ストアに渡す次のスニペットは正しいですか?手順は?エラーが発生するため

new SqlParameter() { ParameterName = "@settingData", SqlDbType = SqlDbType.NVarChar, Value = userSettingToUpdate.SettingData 



------------------------

「値の変換」データベース フィールドをオブジェクトにマッピングしたり、その逆にデータベース フィールドをオブジェクトにマッピングしたりできます。

modelBuilder
    .Entity<UserSetting>()
    .Property(e => e.SettingData )
    .HasConversion(
                v => JsonConvert.SerializeObject(v, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }),
                v => JsonConvert.DeserializeObject<MyClass>(v, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));

4

あなたの回答に基づいて結果を表示するために OP を更新しましたが、MyProperty の値が null になりました。私の JSON は正しいですか?

– ロッド

2020 年 9 月 3 日 4:21

2

指定した JSON は、定義された会話に対して正しくない 2 つのクラスを生成します。JSON を変更するか、MyClass 定義を更新してそれを処理する必要があります。json2csharp.com を使用して、JSON が何を生成するかを確認してください。

– モジタバ タジク語

2020 年 9 月 3 日 4:34

ありがとうございます。json2csharp への素晴らしいリンクは、これまで知りませんでした。

&ndアッシュ; ロッド

2020 年 9 月 3 日 4:46

Update2 を OP に追加しました。UserSetting の SettingData プロパティのみを更新しようとしています。パラメータを正しく渡しているかどうかわかりません。 userToUpdate と userToUpdate.SettingData を試しましたが、次のエラーが発生しました。

– ロッド

2020 年 9 月 3 日 5:14

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。