我正在使用EF Core。
我的Address1
实体包含属性Address2
,AddressFull
和Address1
。
根据哪个系统向我发送数据,我可能会收到Address2
和AddressFull
,或者我可能会收到Address1
。
所以我需要:
Address2
和AddressFull
,Address1
不需要Address2
和AddressFull
不需要, entityTypeBuilder.Property(p => p.Address1).IsRequired(false);
entityTypeBuilder.Property(p => p.Address2).IsRequired(false);
entityTypeBuilder.Property(p => p.AddressFull).IsRequired(false);
所以我有:
{{1}}
但是这个配置没有正确映射到我的域,我想强制执行逻辑。在EF Core中可以吗?
答案 0 :(得分:1)
您需要根据您的场景允许您的DbContext不同的映射,您可以检查此答案以在DbContext中启用更改映射:
答案 1 :(得分:1)
通常,有两种方法可以实现这种类型的复杂域逻辑。您可以使用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();
}
}