如何使用 EF Core 在模型属性之间强制执行非此即彼的关系?
How do I enforce an either-or relationship between model properties, using EF Core?
我正在使用 EF Core。
我的 Customer
实体具有属性 Address1
、Address2
和 AddressFull
。
根据哪个系统向我发送数据,我可能会收到 Address1
和 Address2
,或者我可能会收到 AddressFull
.
所以我需要:
- 需要
Address1
和Address2
,AddressFull
不需要
- OR
Address1
和 Address2
不需要,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();
}
}
我正在使用 EF Core。
我的 Customer
实体具有属性 Address1
、Address2
和 AddressFull
。
根据哪个系统向我发送数据,我可能会收到 Address1
和 Address2
,或者我可能会收到 AddressFull
.
所以我需要:
- 需要
Address1
和Address2
,AddressFull
不需要 - OR
Address1
和Address2
不需要,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();
}
}