首页 > 解决方案 > 使用实体框架联合复合时使两列唯一

问题描述

我有两列名为MonkeyDonkey。两者都是非空的,即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. 此答案中还建议使用IndexAnnotation.AnnotationNamefrom System.Data.Entity.Infrastructure.Annotations

问题是我找不到该方法,而只能看到HasAnnotation. 我不清楚它是否是更新的版本(因为链接到的帖子现在有点过时了)。我也无法访问语句中的命名空间实体。using

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

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

我也尝试过使用 index ,但这需要我声明一个专门的类,这看起来很笨重,并且表明这是错误的方法。

builder.Entity<Thing>()
  .HasIndex(a => new IndexDedicatedClass(a.Monkey, a.Donkey))
  .IsUnique();

标签: c#entity-frameworkasp.net-core-3.1

解决方案


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

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

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

更多信息


推荐阅读