2014-11-15 5 views
5

Ich versuche, ein Code-erstes Modell für Entity Framework 7 zu erstellen. Ich verwende kürzlich veröffentlichte Visual Studio 2015 Beta und die folgenden Versionen von EntityFramework-Pakete (Snippet aus meiner project.json-Datei):Wie erstellt man einen Index für eine String-Eigenschaft in Entity Framework 7

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

Es sieht aus wie zur Zeit keine Daten Anmerkungen verfügbar sind, und ich bin die OnModelCreating Überschreibung und vor kurzem implementiert (teilweise) Migrationen mein Modell zu schaffen?.

Momentan funktionieren Primärschlüssel und Eins-zu-eins-Beziehungen genauso wie das Erstellen von Indizes für ganzzahlige Typen. Zum Beispiel:

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

Dieser Code-Schnipsel Ergebnisse in der folgenden Migrationen Code erzeugt werden:

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

Aber wenn ich versuche Index String-Eigenschaft hinzuzufügen, wird die Migration erzeugt, aber bei der Anwendung wird von SQL Server abgelehnt, offensichtlich aufgrund des Spaltentyps nvarchar (MAX). Es scheint so, als ob die .Required().MaxLength(100) die Erzeugung begrenzter String-Spalten nicht erzwingt. Und obwohl es ein Verfahren ist, den Spaltentyp zu ändern, kann ich nicht scheinen, um die Art und Weise zu finden, sie durch Modelbuilder zu nennen:

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

resultierende Migration:

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

Gibt es eine Möglichkeit, einen Index zu erstellen auf String-Eigenschaft in der Beta-Version von EF7?

+1

BTW, ich habe auch eingereicht [# 1071] (https://github.com/aspnet/EntityFramework/issues/1071). – bricelam

Antwort

5

Leider werden zu diesem Zeitpunkt (7.0.0-beta1) die Metadaten für die maximale Länge und den Spaltentyp bei der Bestimmung des zu verwendenden Spaltentyps nicht berücksichtigt. Vorerst müssen Sie in der Migration auf die rohe DDL-Datei zurückgreifen.

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

Danke für die Info. Derzeit Ich ging die erzeugte Migrationen Datei manuell bearbeiten, Hinzufügen der 'dataType' Parameter: ' migrationBuilder.CreateTable ("Keyword", c => new { Id = c.Int (nullable: false, Identität: true), Wort = c.String (nullable: false, maxLength: 100, datatype: "nvarchar (100)") }) .PrimaryKey ("PK_Keyword", t => t.Id); ' Es sieht Wie sollte Ihre Variante auch in der generierten Migrationsdatei statt in OnModelCreating overload erfolgen? –

+0

Richtig, im Migrationscode. (Ich habe meine Antwort geklärt.) – bricelam

Verwandte Themen