使用 EF Core 写入或读取时序列化和反序列化实体的问题

Problem with serialize and deserialize an entity when write or read using EF Core

我有一个 customer 实体,它有一个具有以下属性的 picture 实体:

public class Customer
{
    public Int Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public Pictures Pictures { get; set; }
}

public class pictures
{
    public Guid? picture1 { get; set; }
    public Guid? picture2 { get; set; }
}

我打算将它作为 json 保存在数据库中,所以我像这样序列化和反序列化它:

public class CustomerEntityTypeConfiguration : IEntityTypeConfiguration<Customer>
{
        public void Configure(EntityTypeBuilder<Customer> builder)
        {
            builder.ToTable("Customers");

            builder.HasKey(o => o.Id);

            builder.Property(o => o.Picures).HasConversion(
               s => JsonConvert.SerializeObject(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }),
               s => JsonConvert.DeserializeObject<Pictures>(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })
            );
        }
}

这样,当我没有向图片实体添加任何图片时,它显示 table 中的图片字段为空,但我认为它会是这样的 json:

{
    picture1:"",
    picture2:""
}

我打算将图片另存为 json,但我认为我的实体没有正确序列化,因为数据库中的图片字段为空,当我在代码中为它的每个属性添加一个 guid 作为正在关注

customer.pictures.picture1 = pictureGuid;

我遇到异常:

NullReferenceException: Object reference not set to an instance of an object

当您这样做时:customer.pictures.picture1 = pictureGuid; 您在 Customer 中的图片对象为空,因为您没有在任何地方对其进行初始化。

您可以将您的客户 class 更改为:

public class Customer
{
    public Int Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public Pictures Pictures { get; set; } = new Pictures();
}

但我宁愿站在你的角度考虑代码逻辑。比如,当你做 customer.pictures.picture1 = pictureGuid 为什么你的图片对象没有初始化?是第一次访问吗?如果是这样,那么您应该首先执行:customer.pictures = new Pictures() 然后为其赋值。这取决于用例...

NullValueHandling.Ignore 只会忽略对象的空属性。当整个对象为空时,它将不起作用。所以你至少需要初始化Pirtures对象。

您可以在此处查看 NullValueHandling 选项的示例:https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm