使非基元属性的组合在实体框架中唯一

本文关键字:实体 框架 唯一 组合 属性 | 更新日期: 2023-09-27 18:21:50

有人知道如何使用实体框架的代码优先方法将另一个类用作多列唯一索引的一部分吗?

我想让所有人的ExternalId和PersonCategory.Id的组合都是唯一的,这样同一对"ExternalId"answers"PersonCategory.Id"的数据库中只能存在一个人。关于如何实现这种行为,有什么想法吗?

我尝试使用Index注释,但这导致只有ExternalId是唯一的,Category属性被忽略。

public class Person
{
    public int Id { get; set; }
    [Required]
    [Index("IX_Person_PersonCategory", 1, IsUnique = true)]
    [MaxLength(100)]
    public string ExternalId { get; set; }
    [Required]
    [Index("IX_Person_PersonCategory", 2, IsUnique = true)]
    public PersonCategory Category { get; set; }
    ...
}
public class PersonCategory
{
    public int Id { get; set; }
    ...
}

使非基元属性的组合在实体框架中唯一

您不能向导航属性(EF元素)添加唯一索引(位于DB中)。索引必须位于用于链接Person和PersonCategory的实际外键中。

为了配置它,您必须在Person实体中显式定义PersonCategoryId。

public class Person
{
    public int Id { get; set; }
    [Required]
    [Index("IX_Person_PersonCategory", 1, IsUnique = true)]
    [MaxLength(100)]
    public string ExternalId { get; set; }
    [Index("IX_Person_PersonCategory", 2, IsUnique = true)]
    public int CategoryId { get; set; }
    public PersonCategory Category { get; set; }
    ...
}