代码之家  ›  专栏  ›  技术社区  ›  Konrad Viltersten

使用实体框架联合组合时使两列唯一

  •  0
  • Konrad Viltersten  · 技术社区  · 3 年前

    我有两列名为 猴子 。两者都不是空的,即。 null 不允许。设置声明如下。

    protected override void OnModelCreating(ModelBuilder builder)
    {
      base.OnModelCreating(builder);
      ...
      builder.Entity<Thing>()
        .Property(a => a.Monkey)
        .IsRequired();
      builder.Entity<Thing>()
        .Property(a => a.Donkey)
        .IsRequired();
    }
    

    现在,我了解到组合的内容必须是唯一的,即任何记录都不能有相同的猴子和驴子。根据 MSDN (多个道具的索引),我应该使用 HasColumnAnnotation 并传递的实例 IndexAnnotation 。中也有建议 this answer 使用 IndexAnnotation.AnnotationName 从…起 System.Data.Entity.Infrastructure.Annotations .

    问题是我找不到那个方法,只能看到 HasAnnotation 。我不清楚这是否是最近的版本(因为链接到的帖子现在有点过时了)。我无法访问命名空间 实体 在中 using 声明,两者都没有。

    builder.Entity<Thing>()
      .Property(a => a.Monkey)
      .HasAnnotation(...);
    

    这是正确的方法吗?还是我应该继续寻找另一种注释方法?缺少什么来获取命名空间?索引是一开始的合适方式吗?

    我也尝试过索引,但这需要我声明一个专门的类,这看起来很笨拙,表明这是错误的做法。

    builder.Entity<Thing>()
      .HasIndex(a => new IndexDedicatedClass(a.Monkey, a.Donkey))
      .IsUnique();
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   abdusco    3 年前

    您可以添加一个跨多列的复合索引,然后将其标记为唯一索引,从而在数据库上创建一个唯一索引。

    modelBuilder.Entity<Thing>(builder =>
    {
        builder
            .HasIndex(e => new { e.Monkey, e.Donkey })
            .IsUnique();
    });
    

    这实际上有助于确保 ($monkey, $donkey) 元组在表中出现两次。

    进一步信息

    推荐文章