2013-03-14 7 views
5

Próbuję wymusić unikalne ograniczenie kolumny przy użyciu płynnej konfiguracji kodu. Czy istnieje lepszy sposób niż wdrożenie go w logice biznesowej lub przy użyciu coś jak poniżejKod EF Pierwszy interfejs Fluent API definiuje ograniczenie unikalne

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

Albo Zastanawiałem się, czy to nie jest możliwe do wykonania przy użyciu unikalnego Powiąż płynne konfiguracje?

EDIT:

To potwierdziło, że nie jest to możliwe z płynną konfiguracjach. Ale znowu zastanawiam się, jaki jest najlepszy sposób na zrobienie tego? Chciałbym poznać powód, dla którego EF nie popiera tego.

+1

Zespół rozważa: http://entityframework.codeplex.com/workitem/299 – ErikEJ

Odpowiedz

1

mam ten problem wystąpił przed

nie może realizować unikalny Powiąż za pomocą biegle API.

więc, sposób używany jest poprawny!

+0

dzięki za odpowiedź. Ale jeśli zrobię to za pomocą polecenia, będzie to zależne od implementacji mojej bazy danych. To coś, czego nie chcę mieć. – Geethanga

2

W tym przykładzie można zobaczyć, jak zdefiniować unikalny atrybut klucza i użyć go w dowolnej encji.

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

+1

Dzięki za odpowiedź Imran. Właściwie to dobry sposób na zrobienie tego. Ale w końcu to, co robi, to wykonanie instrukcji SQL specyficznej dla dostawcy, więc w przypadku gdy zmienię moją bazę danych na innego dostawcę, skończę modyfikować kod. Ale zgadzam się, że będę musiał zmodyfikować tylko jedno miejsce. – Geethanga

1

Jest to możliwe dzięki DbMigrations ...

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

Tak, tak, napisałem też post na blogu, na którym można go znaleźć tutaj (http://goo.gl/Ks9HZI). Ale moim pierwotnym pytaniem było, czy istnieje sposób, aby to zrobić z Fluent API. – Geethanga

+0

Problem z wprowadzeniem niestandardowego kodu do migracji polega na ryzyku utraty tego kodu, gdy zdecydujesz się oczyścić/połączyć/zregenerować swoje migracje. Sugeruję zachowanie wszystkich konfiguracji w klasach 'EntityTypeConfiguration'. Sprawdź moją odpowiedź na to: http://stackoverflow.com/a/25779397/111438. – niaher

1

Można to zrobić za pomocą metody niestandardowe rozszerzenia:

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); 
    } 
} 

Sprawdź pełną odpowiedź tutaj : https://stackoverflow.com/a/25779348/111438

+0

Co powiesz na 2 kolumny razem tworzące unikalny klucz? –

Powiązane problemy