Entity framework 实体框架核心-具有转换-支持空值
我有一个带有通知电子邮件属性的EF模型。通知电子邮件以字符串形式保存在数据库中,以“;”分隔。我添加了一个转换来检索模型中作为ICollection的数据。除了一件事之外,它工作得很好:当字符串为null时,集合也为null,我想将其转换为空集合。可能吗Entity framework 实体框架核心-具有转换-支持空值,entity-framework,asp.net-core,entity-framework-core,Entity Framework,Asp.net Core,Entity Framework Core,我有一个带有通知电子邮件属性的EF模型。通知电子邮件以字符串形式保存在数据库中,以“;”分隔。我添加了一个转换来检索模型中作为ICollection的数据。除了一件事之外,它工作得很好:当字符串为null时,集合也为null,我想将其转换为空集合。可能吗 //This is my code entity.Property(e => e.NotificationEmails) .HasConversion( v => str
//This is my code
entity.Property(e => e.NotificationEmails)
.HasConversion(
v => string.Join(",", v.Select(s => s.Trim())),
v => v.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
我试图添加String.IsNullOrEmpty(v),但EF忽略了它。目前,不可能: 空值永远不会传递给值转换器。这使得转换的实现更加容易,并允许在可为null和不可为null的属性之间共享转换 但可能在EF Core 5中: 它并不优雅,但您可以使用支持字段:
公共类通知
{
私人列表_emails=新列表();
公开名单电子邮件
{
获取=>\u电子邮件;
set=>_emails=value??新建列表();
}
}
公共类NotificationContext:DbContext
{
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().Property(d=>d.Emails).HasConversion(
v=>string.Join(“,”,v.Select(s=>s.Trim()),
v=>v.Split(新[]{',},StringSplitOptions.RemoveEmptyEntries.ToList())
);
modelBuilder.Entity()
.Property(b=>b.email)
.HasField(“\u电子邮件”)
.UsePropertyAccessMode(PropertyAccessMode.Property);
}
}
注意:在where中,空列表不会转换为null,而是转换为空字符串。将数据存储为分号分隔的项是一个糟糕的主意。“做一张桌子就行了。”戴维格,你能解释一下为什么吗?首先,你不需要像这里这样糟糕的转换器。有很多原因。@DavidG您知道的任何其他原因真的会有帮助吗?@TalHumy其他一些原因:服务器端过滤不可能(或很难做到)。无法单独添加/删除/更新项目-必须更新整个项目。等等。但为了回答您的具体问题,迄今为止,EF核心值转换器不适用于
null
值-假设null
始终转换为null
。因为无论如何都不能在L2E查询中使用这样的集合,所以可以在对象级别使用显式支持字段和特殊属性getter来处理它。