In Entity Framework 6.1 (nicht der Kern), wie kann ich mit der IndexAttribute definieren Sie einen gruppierten index?
Entity Framework 6.1 (code-first) hat die Möglichkeit, das hinzufügen von Indizes über die IndexAttribute
. Das Attribut ist ein parameter für die Angabe, ob der index sollte gruppierten oder nicht gruppierten.
Zur gleichen Zeit, AFAIK, Entity Framework benötigt jede Entität einen Primärschlüssel haben (kommentiert mit der KeyAttribute
), und dass der Primärschlüssel wird immer als gruppierten - Taste.
Daher, sobald ich das IndexAttribute
mit IsClustered = true
, bekomme ich eine Fehlermeldung, weil der Schlüssel, die es schon gibt ist einen gruppierten index.
So, wie kann ich erstellen Sie einen gruppierten index, der nicht der Primärschlüssel über die IndexAttribute
? Ist die IsClustered
Eigenschaft des IndexAttribute
geeignet sind, auf allen?
(Für ein wenig mehr Kontext: ich bin mapping einer Tabelle, die ist nur für Auslesen mit LINQ-Abfragen. Ich brauche Sie nicht wirklich einfügen, aktualisieren oder löschen von Entitäten aus, die Tabelle. Daher brauche ich nicht einen primary key an alle. Im Idealfall würde ich gerne eine Tabelle ohne Primärschlüssel, aber mit einem nicht eindeutigen gruppierten index optimiert für das Lesen.)
Bearbeiten (2014-04-11): Siehe auch https://entityframework.codeplex.com/workitem/2212.
- Möglich, Duplikat der Wie erstellen Sie einen Gruppierten Index mit Entity Framework-Kern
- Wie wäre es, ein Duplikat dieser Frage, wenn Sie Entity Framework-Kern ist eine völlig andere Sache als die, Entity Framework 6.1? Auch diese Frage ist ab 2014, wenn die Entity Framework-Kern gar nicht existiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann es nur einen gruppierten index für eine Tabelle und standardmäßig Entity Framework/Sql Server setzt es auf den primary key.
So was benutzen, ist die
IsClustered
- Attribut auf einen index, der nicht der Primärschlüssel? Gute Frage! (+1)Dieser Klasse:
generiert diese die migration:
Alter der Umstellung auf diese:
Und das sollte erstellen Sie die Tabelle ohne einen Primärschlüssel, aber mit den gruppierten index auf die anderen Spalten
BEARBEITEN
In Ihrem Szenario, wo Sie nicht brauchen, um insert -, update-oder delete-Daten, die Sie nicht brauchen, eine vollständige geblasen Entität, die Sie nutzen könnten raw-sql-Abfragen zum Auffüllen der Klassen. Müssen Sie fügen Sie Ihre eigenen sql, um die migration zum erstellen der Tabelle verwenden, da EF nicht automatisieren, aber das bedeutet, dass Sie können erstellen Sie die Tabelle und den index genauso wie Sie es wollen.
IndexAttribute
's Eigenschaften isclustered Eigenschaft ist effektiv nutzlos und erfordert die manuelle workarounds, wie von hand geschrieben, Migrationen oder eine Unterklasse code-generator".Können Sie leiten Sie Ihre eigene Klasse von SqlServerMigrationSqlGenerator
und ändern pk Schöpfung:
vollständiges Beispiel hier
https://entityframework.codeplex.com/workitem/2163
Unten ist der code basiert auf raditch Antwort, die für mich gearbeitet. Dies ermöglicht es der primäre Schlüssel wird standardmäßig clustered verwendet. Vielleicht braucht es gezwickt, da wir nicht mit dem eingebauten ef-Migrationen eigentlich mit den änderungen
Sage Euch die Wahrheit - der IndexAttribute ist Total überflüssig und nicht passend für professinal Entwicklung. Ihnen fehlen die grundlegenden Funktionen und Fokus auf Dinge, die wenig Sinn macht.
Warum? Weil es nie können werden und sollte so flexibel sein, wie ein build-Skript. Clustered index ist nur eine Sache - die nächste Sache, die ich vermissen würde, ist ein gefilterter index, meist in der form von "Unique-index nicht null, nicht eindeutigen index für null" auf ein Feld, das ich gerade sehr regelmäßig für optionale eindeutige codes (denn im SQL Server einen NULL-Wert entspricht, um eine weitere NULL in SQL-Generierung, so dass Sie nur eine NULL in einer Zeit, in der ein eindeutiger index).
Wenn ich du wäre ich würde bleiben Weg von Datenbank-generation - und-Migrationen - und verwenden ein klassisches setup - /Migrations-Skripts Ansatz. Thta ist etwas, wo Sie mehr tun können komplexe mehrstufige Migrationen ohne möglicherweise ata-Verlust. EF nicht behandelt, was aber die meisten grundlegenden Szenarien - und in diesen Bereichen habe ich Zweifel, dass das ausreicht. Kann sein, es ist, weil ich auch und arbeiten meist auf große Datenbanken, in denen wir unsere änderungen sehr vorsichtig sein - das hinzufügen eines Indexes kann einige Zeit in Anspruch nehmen, wenn man eine zweistellige Zahl von Milliarden von Zeilen (!0+).
Ich würde lieber die Entwickler konzentrieren sich auf einige ofher fehlende Bereiche tht kann nicht einfach und besser umgangen werden, wie Leistung, wie core ORM-Funktionen (besser enums, second-level-caching, bulk-delete-API, mehr performance inserts und updates - alles Dinge, die sind machbar). Code First ist schön. Erste Code-Generierung und maintainign die Datenbank - schmerzvoll außen sehr einfachen Szenarien.
IndexAttribute
(ich habe die Frage umformuliert, um zu betonen) und seineIsClustered
option, das scheint unbrauchbar zu sein für mich. Ich möchte nur wissen, ob ich etwas fehlt 🙂Schreibe ich hier meine Lösung, falls noch jemand an diesem Thema interessiert.
Unter code-änderungen-Ausgabe der add-migration-Befehl.
Können Sie sich registrieren, dieser generator in der migration-Konfiguration:
Und hier ist die generierte migration-code:
Hier ist der Artikel über benutzerdefinierte MigrationCodeGenerator.