1
  1. 我使用流畅的 API。我不喜欢注释。

  2. 我喜欢在所有表中始终使用自动增量作为主键。

  3. 我的一些表要求两列 X 和 Y(其中 X 不是自动增量键,Y 不是自动增量键)必须是唯一的,即:不能有另一行使其具有 X1=X2 和Y1=Y2。如果我不使用自动增量键,我只需将这两个键设为键,如下所示:

        modelBuilder.Entity<Foo>()
            .HasKey(t => new { t.X, t.Y })
            .ToTable("Foos");
    

    但是,正如我在 (2) 中所说,我使用的是自动增量主键

        modelBuilder.Entity<Foo>()
            .HasKey(t => t.someLongId)
            .ToTable("Foos");
    

如何在 Fluent API 中实现这种复合唯一性?

这就是我想要实现的,用 SQL 编写的:

CREATE  TABLE `Foos` (
  `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT ,
  ...
  PRIMARY KEY (`ID`),
  UNIQUE KEY (`X`, `Y`) 
);
4

2 回答 2

2

您可以使用“HasColumnAnnotation(...)”方法并应用 IndexAnnotation > IndexAttribute 来实现此目的。

modelBuilder.Entity<Foo>() 
            .Property(t => t.X) 
            .HasColumnAnnotation("X", new IndexAnnotation(new IndexAttribute("X") { IsUnique = true }));

您可以在此处找到更多信息 (MSDN)

于 2014-10-09T04:30:53.347 回答
1

Aydin 的回答有概念 (IndexAnnotationHasColumnAnnotation),但不涉及其他列。这是一个对我有用的完整答案:

modelBuilder
    .Entity<Foo>()
    .Property(t => t.X)
    .IsRequired()
    .HasMaxLength(60)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_X_Y", 1) { IsUnique = true }));

modelBuilder
    .Entity<Foo>()
    .Property(t => t.Y)
    .IsRequired()
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_X_Y", 2) { IsUnique = true }));

也就是说,假设 X 是字符串列而 Y 不是(只是为了说明如何在字符串列中使用 .HasMaxLength(60) )

不过,我会接受艾登的回答。

于 2014-10-09T16:20:52.447 回答