使用 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
我有一个 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