2014-11-15 18 views
5

Próbuję utworzyć pierwszy model kodu dla Entity Framework 7. Używam ostatnio wydanego Visual Studio 2015 Beta i następujących wersji pakietów EntityFramework (urywek z mojego pliku project.json):Tworzenie indeksu dla właściwości ciągu w Entity Framework 7

"EntityFramework.SqlServer": "7.0.0-beta1", 
"EntityFramework.Commands": "7.0.0-beta1", 

wygląda na to żadnych adnotacji danych są dostępne i używam nadpisanie OnModelCreating a ostatnio wdrożone (częściowo) migracje do tworzenia mojego modelu?.

Na razie działają klucze podstawowe i relacje jeden-do-jednego, jak również tworzenie indeksów dla typów całkowitych. Na przykład:

builder.Entity<Article>(e => 
{ 
    e.Key(c => c.Id); 
    e.OneToOne<Category>(c => c.Category); 
    e.Index(c => c.Time).IsUnique(false); 
}); 

Wyniki tego fragmentu w poniższym kodzie migracje mają być generowane:

migrationBuilder.CreateTable("Article", 
      c => new 
       { 
        Id = c.String(), 
// ... 
        CategoryIdKey = c.Int(nullable: false), 
        Time = c.DateTime(nullable: false), 
// ... 
       }) 
      .PrimaryKey("PK_Article", t => t.Id) 
      .UniqueConstraint("UC_Article_CategoryIdKey", t => t.CategoryIdKey); 

     migrationBuilder.AddForeignKey("Category", "FK_Category_Article_CategoryId", new[] { "CategoryId" }, "Article", new[] { "CategoryIdKey" }, cascadeDelete: false); 

     migrationBuilder.CreateIndex("Article", "IX_Article_Time", new[] { "Time" }, isUnique: false, isClustered: false); 

Ale gdy próbuję dodać indeks właściwości String, migracja jest generowany, ale po nałożeniu jest odrzucany przez SQL Server, najwyraźniej ze względu na typ kolumny będący nvarchar (MAX). Wygląda na to, że .Required().MaxLength(100) nie wymusza generowania ograniczonego typu kolumny ciągów. I choć nie jest to metoda, aby zmienić typ kolumny, nie wydaje się znaleźć sposób, aby połączyć je poprzez ModelBuilder:

 builder.Entity<Keyword>(e => 
     { 
      e.Key(c => c.Id); 
      e.Property(c => c.Word).Required().MaxLength(100); 
      e.Index(c => c.Word).IsUnique(true); 
     }); 

W wyniku migracji:

 migrationBuilder.CreateTable("Keyword", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Word = c.String(nullable: false, maxLength: 100) 
       }) 
      .PrimaryKey("PK_Keyword", t => t.Id); 

     migrationBuilder.CreateIndex("Keyword", "IX_Keyword_Word", new[] { "Word" }, isUnique: true, isClustered: false); 

Czy istnieje sposób, aby utworzyć indeks na własności string w wersji beta EF7?

+1

BTW, ja też złożyć [# 1071] (https://github.com/aspnet/EntityFramework/issues/1071). – bricelam

Odpowiedz

5

Niestety w tym czasie (7.0.0-beta1) metadane o maksymalnej długości i typu kolumny nie są uwzględniane przy określaniu typu kolumny. Na razie musisz przejść do surowego DDL w migracji.

// Add before CreateIndex 
migrationBuilder.Sql("ALTER TABLE [Keyword] ALTER COLUMN [Word] nvarchar(4000)"); 
+0

Dzięki za informacje. Obecnie, poszedłem ręczną edycję wygenerowanego pliku migracje, dodając parametr 'dataType': ' migrationBuilder.CreateTable ("słów kluczowych", c => new { id = c.Int (pustych: fałszywa tożsamość: true), Słowo = c.String (pustych: false, MaxLength: 100, dataType: "nvarchar (100)") }) .PrimaryKey ("PK_Keyword", t => t.Id); ' wygląda jak twój wariant powinien być również wykonany w wygenerowanym pliku migracyjnym, zamiast nadmiarowego OnModelCreating? –

+0

Prawidłowo, w kodzie migracji. (Wyjaśniłem moją odpowiedź.) – bricelam

Powiązane problemy