如何使用 EF Core 在模型属性之间强制执行非此即彼的关系?

How do I enforce an either-or relationship between model properties, using EF Core?

我正在使用 EF Core。

我的 Customer 实体具有属性 Address1Address2AddressFull

根据哪个系统向我发送数据,我可能会收到 Address1Address2,或者我可能会收到 AddressFull.

所以我需要:

所以我有:

  entityTypeBuilder.Property(p => p.Address1).IsRequired(false);
  entityTypeBuilder.Property(p => p.Address2).IsRequired(false);
  entityTypeBuilder.Property(p => p.AddressFull).IsRequired(false);

但是这个配置没有正确映射到我的域,我想强制执行这个逻辑。这在 EF Core 中可能吗?

您需要允许您的 DbContext 根据您的场景进行不同的映射,您可以查看此答案以在您的 DbContext 中启用更改映射:

一般来说,有两种方法可以实现这种复杂的领域逻辑。您可以使用 CHECK 约束或触发器在数据库中执行此操作,或者您可以在域对象中执行此操作并在 SaveChanges 期间检查它们。这是后者的一个例子。

class MyEntity : IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.IsNullOrEmpty(Address1)
            && string.IsNullOrEmpty(Address2)
            && string.IsNullOrEmpty(AddressFull))
        {
            yield return new ValidationResult("An address is required.");
        }
    }
}

class MyContext : DbContext
{
    public override int SaveChanges()
    {
        var entities = from e in ChangeTracker.Entries()
                       where e.State == EntityState.Added
                           || e.State == EntityState.Modified
                       select e.Entity;
        foreach (var entity in entities)
        {
            var validationContext = new ValidationContext(entity);
            Validator.ValidateObject(
                entity,
                validationContext,
                validateAllProperties: true);
        }

        return base.SaveChanges();
    }
}