Entity framework core EF核心可选ValueObject作为标识

Entity framework core EF核心可选ValueObject作为标识,entity-framework-core,ef-core-3.0,value-objects,null-object-pattern,Entity Framework Core,Ef Core 3.0,Value Objects,Null Object Pattern,我使用值对象作为标识,并想知道如何最好地处理EF核心中的空值 例如,如果我有一名具有可选职称(先生、太太等)的员工: 我可以在代码中的任何地方检查空值 if (employee.TitleId == null) ... 或者我可以使用默认值,例如 if (employee.TitleId.Equals(EmployeeTitleId.None)) ... 使用EmployeeTitleId实现如下: public class EmployeeTitleId : Value<Empl

我使用值对象作为标识,并想知道如何最好地处理EF核心中的空值

例如,如果我有一名具有可选职称(先生、太太等)的员工:

我可以在代码中的任何地方检查空值

if (employee.TitleId == null) ...
或者我可以使用默认值,例如

if (employee.TitleId.Equals(EmployeeTitleId.None)) ...
使用
EmployeeTitleId
实现如下:

public class EmployeeTitleId
  : Value<EmployeeTitleId>
{
  public static readonly EmployeeTitleId None = new EmployeeTitleId();

  protected EmployeeTitleId() { }

  public EmployeeTitleId(Guid value)
  {
    if (value == default)
      throw new ArgumentNullException(nameof(value), "Employee title id cannot be empty");

    Value = value;
  }

  public Guid Value { get; internal set; }

  public static implicit operator Guid(EmployeeTitleId self) => self.Value;

  public static implicit operator EmployeeTitleId(string value)
    => new EmployeeTitleId(Guid.Parse(value));

  public override string ToString() => Value.ToString();
}

这似乎是一种可行的方法,还是我应该坚持检查null?如果是这样,我是否可以在实体类型配置中使用约定,这样我就不必手动设置每个HasConversion?

还有另一种全局过滤结果的方法。您可以在
OnModelCreating
中进行如下配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // code omitted for brevity

    modelBuilder.Entity<Employee>().HasQueryFilter(p => p.TitleId == null);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
//为简洁起见省略了代码
modelBuilder.Entity().HasQueryFilter(p=>p.TitleId==null);
}

还有另一种全局过滤结果的方法。您可以在
OnModelCreating
中进行如下配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // code omitted for brevity

    modelBuilder.Entity<Employee>().HasQueryFilter(p => p.TitleId == null);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
//为简洁起见省略了代码
modelBuilder.Entity().HasQueryFilter(p=>p.TitleId==null);
}

这是否意味着当我查询Emaplyes数据库集时,只返回标题为空的记录?我试图做的是避免在我的应用层代码中进行空检查。这是一个全局过滤器,应用于对数据库的每次调用。
null
检查就是一个例子,但您可以使用它仅检索所需的数据,而不必每次都进行检查。我不是在尝试筛选记录,我是在尝试避免代码中的if(xyz==null)检查这是否意味着在查询Emaplyes DbSet时只返回标题为null的记录?我试图做的是避免在我的应用层代码中进行空检查。这是一个全局过滤器,应用于对数据库的每次调用。
null
检查就是一个例子,但您可以使用它仅检索所需的数据,而不必每次都进行检查。我不是在尝试筛选记录,我是在尝试避免如果我的代码中的(xyz==null)检查不能
EmployeeTitleId
成为具有默认值(0=None)的枚举在数据库字段中?标题列表由用户维护,它不是固定列表不能
EmployeeTitleId
是数据库字段中具有默认值(0=无)的枚举?标题列表由用户维护,它不是固定列表
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // code omitted for brevity

    modelBuilder.Entity<Employee>().HasQueryFilter(p => p.TitleId == null);
}