1. ホーム
  2. c#

[解決済み] fluent APIで一意なConstraintを設定する?

2022-04-13 14:22:46

質問

私はコードファーストでEFエンティティを構築しようとしています。 EntityTypeConfiguration 主キーの作成は簡単ですが、一意性制約があるとそうはいきません。このためにネイティブのSQLコマンドを実行することを提案する古い投稿を見ましたが、それは目的を失っているように思えます。

解決方法は?

について EF6.2 を使用することができます。 HasIndex() を使用して、fluent API を使用してマイグレーション用のインデックスを追加します。

https://github.com/aspnet/EntityFramework6/issues/274

modelBuilder
    .Entity<User>()
    .HasIndex(u => u.Email)
        .IsUnique();

について EF6.1 以降では IndexAnnotation() を使用して、流れるような API でマイグレーション用のインデックスを追加します。

http://msdn.microsoft.com/en-us/data/jj591617.aspx#PropertyIndex

への参照を追加する必要があります。

using System.Data.Entity.Infrastructure.Annotations;

基本的な例

ここでは、簡単な使用法を紹介します。 User.FirstName プロパティ

modelBuilder 
    .Entity<User>() 
    .Property(t => t.FirstName) 
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute()));

実用例です。

ここでは、より現実的な例を紹介します。これは ユニークインデックス を複数のプロパティに設定することができます。 User.FirstNameUser.LastName というインデックス名を持つ。

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

modelBuilder 
    .Entity<User>() 
    .Property(t => t.LastName) 
    .IsRequired()
    .HasMaxLength(60)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName, 
        new IndexAnnotation(
            new IndexAttribute("IX_FirstNameLastName", 2) { IsUnique = true }));