如何使用EF Core强制模型属性之间的关系?

时间:2016-12-12 09:16:24

标签: c# entity-framework ef-code-first entity-framework-core ef-fluent-api

我正在使用EF Core。

我的Address1实体包含属性Address2AddressFullAddress1

根据哪个系统向我发送数据,我可能会收到Address2AddressFull,或者我可能会收到Address1

所以我需要:

  • 需要Address2AddressFullAddress1不需要
  • OR Address2AddressFull不需要, entityTypeBuilder.Property(p => p.Address1).IsRequired(false); entityTypeBuilder.Property(p => p.Address2).IsRequired(false); entityTypeBuilder.Property(p => p.AddressFull).IsRequired(false);

所以我有:

{{1}}

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

2 个答案:

答案 0 :(得分:1)

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

Dynamically changing schema in Entity Framework Core

答案 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();
    }
}