Entity framework core EF核心可选ValueObject作为标识
我使用值对象作为标识,并想知道如何最好地处理EF核心中的空值 例如,如果我有一名具有可选职称(先生、太太等)的员工: 我可以在代码中的任何地方检查空值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
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);
}