2016-04-06 16 views
2

私のアプリケーションでは、コードで最初にアプローチするEntityFrameworkを使用しています。私はASP.NET 4.6 MVCとVS2015でEF7を使用しています。だから、エンティティフレームワークコード第1セット:固有のキー制約が機能していない

public class CustomerContext : DbContext 
{ 
    public CustomerContext() 
    { 
     Database.EnsureCreated(); 
    } 
    public DbSet<Customer> Customers { get; set; } 
    protected override void OnConfiguring(DbContextOptionsBuilder options) 
    {  
     var connection = System.Configuration.ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString; 
     options.UseSqlServer(connection).UseRowNumberForPaging(); 
    } 
} 

、モデルクラスからデータベース・テーブルに私はのEmailAddress列に一意の制約を設定したいことがわかりますのEmailAddressを意味:私のコンテキストファイルは、以下のようなものです

public class Customer 
{ 
    public int CustomerID { get; set; } 

    [StringLength(100)] 
    [Required] 
    public string FirstName { get; set; } 

    [StringLength(100)] 
    [Required] 
    public string LastName { get; set; } 

    [Required] 
    [EmailAddress(ErrorMessage = "Please enter valid Email Address.")] 
    [StringLength(100)] 
    [Index("IX_EA", IsUnique = true)] 
    public string EmailAddress { get; set; } 

} 

:私のモデルクラスは、以下のようなものですフィールドには重複した値が含まれている必要があります(電子メールアドレスはテーブル内に繰り返さないでください)。しかし、私がプロジェクトデータベースを実行すると、正常に作成されます。そのユニーク制約は存在しません。なぜ私はEmailAddressフィールドにその制約を設定していないのですか?

EntityFrameworkのコードの最初のアプローチを使用して、フィールドに固有の制約を設定するのを手伝ってください。 EF7 Documentationから

+0

それが一意のインデックスを作成した場合、 ' –

+1

はあなたがCONSTRAINTについて何を気にしていますか?' MAXLENGTH(200)を設定してくださいとにかくインデックスは「より良い」と強制されます。インデックスは、インデックスを上に置かないと便利です。そこにインデックスはありますか? – TomTom

+0

それは動作しませんでした。そして、私は長さが発行することができないと思う – iDipa

答えて

1

インデックスはデータアノテーションを使用して作成することはできません。あなたはまた、別のキーがほかに各エンティティインスタンスの代替一意の識別子として機能しますAlternate keys

を使用することができます

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Customer>() 
     .HasIndex(c => c.EmailAddress) // Create an index 
     .IsUnique() // that is unique 
     .ForSqlServerHasName("IX_EA"); // specify the name 
} 

しかし、あなたは、インデックスを作成するために、流暢なAPIを使用することができますプライマリキーに移動します。リレーショナルデータベースを使用する場合、これは一意のインデックス/制約の概念にマッピングされます。 EFでは、代替キーは外部キーのターゲットとして使用できるため、固有のインデックスよりも優れた機能を提供します。

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Customer>() 
     .HasAlternateKey(c => c.EmailAddress); 
} 
+0

それを使用して、私はEmailAddressフィールドで一意の値を得ました。しかし、そのインデックス名は、私が言及したものとは異なります。 – iDipa

関連する問題