環境:
<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