EF Core 自定义复杂约束
EF Core custom complex constraint
我将简化为以下情况:给定一个与 TEntityType 具有外来关系的模型 TEntity:
public class TEntity
{
public int TEntityTypeId TypeId { get; set; }
public string Name { get;set; }
}
现在,当我想在数据库中插入 TEntity
的新实例时,我希望有一个约束,即名称在同一类型中是唯一的 。在代码中,如果我想插入实例 toBeInserted
,我会检查:
var conflictingEntity = await _repository.FindAsync(entity => entity.Name == toBeInserted.name && entity.TypeId == toBeInserted.TypeId );
if (conflictingEntity)
{
// Don't insert record but, e.g., throw an Exception
}
现在,我还想将该逻辑作为对数据库 itelf 的约束。我如何使用模型构建器配置它?如何配置与其他 properties/fields 有关的更复杂的约束?
在多列上创建索引
public class SampleContext : DbContext
{
public DbSet<Patient> Patients { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Patient>()
.HasIndex(p => new { p.Ssn, p.DateOfBirth})
.IsUnique();
}
}
public class Patient
{
public int PatientId { get; set; }
public string Ssn { get; set; }
public DateTime DateOfBirth { get; set; }
}
看这里:https://www.learnentityframeworkcore.com/configuration/fluent-api/hasindex-method
还有一点,不要尝试在插入之前进行搜索。在多用户系统中,另一个用户完全有可能在您搜索之后但在您插入之前插入一条记录。只需插入您的记录并处理 DbUpdateException
.
我将简化为以下情况:给定一个与 TEntityType 具有外来关系的模型 TEntity:
public class TEntity
{
public int TEntityTypeId TypeId { get; set; }
public string Name { get;set; }
}
现在,当我想在数据库中插入 TEntity
的新实例时,我希望有一个约束,即名称在同一类型中是唯一的 。在代码中,如果我想插入实例 toBeInserted
,我会检查:
var conflictingEntity = await _repository.FindAsync(entity => entity.Name == toBeInserted.name && entity.TypeId == toBeInserted.TypeId );
if (conflictingEntity)
{
// Don't insert record but, e.g., throw an Exception
}
现在,我还想将该逻辑作为对数据库 itelf 的约束。我如何使用模型构建器配置它?如何配置与其他 properties/fields 有关的更复杂的约束?
在多列上创建索引
public class SampleContext : DbContext
{
public DbSet<Patient> Patients { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Patient>()
.HasIndex(p => new { p.Ssn, p.DateOfBirth})
.IsUnique();
}
}
public class Patient
{
public int PatientId { get; set; }
public string Ssn { get; set; }
public DateTime DateOfBirth { get; set; }
}
看这里:https://www.learnentityframeworkcore.com/configuration/fluent-api/hasindex-method
还有一点,不要尝试在插入之前进行搜索。在多用户系统中,另一个用户完全有可能在您搜索之后但在您插入之前插入一条记录。只需插入您的记录并处理 DbUpdateException
.