2013-03-14 15 views
5

Sto cercando di applicare il vincolo univoco di una colonna utilizzando la fluente configurazione per il codice. C'è un modo migliore di attuazione in logica di business o di usare qualcosa di simile sottoEF First Fluent API definisce il vincolo univoco

context.ObjectContext.ExecuteStoreCommand("CREATE UNIQUE CONSTRAINT..."); 

O mi chiedevo se non è possibile implementare vincolo unico utilizzando configurazioni fluente?

EDIT:

È confermato che questo non è possibile con le configurazioni fluente. Ma poi di nuovo mi chiedo quale sia il modo migliore per farlo? E vorrebbe sapere il motivo alla base di EF che non lo supporta.

+1

Il team sta valutando: http://entityframework.codeplex.com/workitem/299 – ErikEJ

risposta

1

ho questo problema si è verificato prima

che non può attuare vincolo unico utilizzando API fluente.

così, il modo in cui si è utilizzato è corretto!

+0

grazie per la risposta. Ma se lo faccio usando un comando dipenderà dall'implementazione del mio database. È qualcosa che non voglio avere. – Geethanga

2

In questo esempio è possibile vedere come definire un attributo chiave Univoco e utilizzarlo in qualsiasi Entità.

http://code.msdn.microsoft.com/windowsdesktop/CSASPNETUniqueConstraintInE-d357224a

+1

Grazie per la risposta Imran. In realtà è un buon modo per farlo. Ma alla fine quello che fa è eseguire un'istruzione SQL specifica del fornitore, quindi nel caso in cui cambi il mio database in un altro fornitore, finirò per modificare il codice. Ma sono d'accordo che dovrò modificare solo un posto. – Geethanga

1

Ciò è possibile con DbMigrations ...

public override void Up() 
{ 
    CreateIndex("dbo.MyTableName", "MyColumnName", unique: true); 
} 
+0

Sì, in effetti ho anche scritto un post sul blog che puoi trovare qui (http://goo.gl/Ks9HZI). Ma la mia domanda iniziale era se c'era un modo per farlo con l'API Fluent. – Geethanga

+0

Il problema con l'inserimento del codice personalizzato nelle migrazioni è che si rischia di perdere quel codice quando si decide di eliminare/combinare/rigenerare le migrazioni. Suggerisco di mantenere tutte le tue configurazioni nelle classi 'EntityTypeConfiguration'. Controlla la mia risposta su come farlo: http://stackoverflow.com/a/25779397/111438. – niaher

1

Esso può essere fatto con un metodo di estensione personalizzata:

using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity.Infrastructure.Annotations; 
using System.Data.Entity.ModelConfiguration.Configuration; 

internal static class TypeConfigurationExtensions 
{ 
    public static PrimitivePropertyConfiguration HasUniqueIndexAnnotation(
     this PrimitivePropertyConfiguration property, 
     string indexName, 
     int columnOrder = 0) 
    { 
     var indexAttribute = new IndexAttribute(indexName, columnOrder) { IsUnique = true }; 
     var indexAnnotation = new IndexAnnotation(indexAttribute); 

     return property.HasColumnAnnotation("Index", indexAnnotation); 
    } 
} 

Controllare la risposta completa : https://stackoverflow.com/a/25779348/111438

+0

Come circa 2 colonne insieme formano una chiave unica? –