2013-06-26 3 views
11

diese Migration Code vor:Wie kann die ROWGUIDCOL-Eigenschaft im Code als Guid-Typ zuerst oder mit ColumnBuilder angegeben werden?

 CreateTable(
      "dbo.Document", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Doc = c.String(), 
        RowGuid = c.Guid(nullable: false), 
        Person_Id = c.Int(), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.Person", t => t.Person_Id) 
      .Index(t => t.Person_Id); 

ich will die RowGuidROWGUIDCOL sein, und wie diese (SQL) definiert werden:

[RowGuid] [UNIQUEIDENTIFIER] not null RowGuidCol Unique default newid() 

Was in EntityFramework/CodeFirst der entsprechende Code ist? Was ist die Lösung?

Danke.

+0

hat jemand eine Lösung noch zu diesem? Ich bin in diesem Punkt blockiert. –

+0

BTW .. was Rowguidcol tut? –

+1

@vishalsharma, gehen Sie zum folgenden Link und scrollen Sie nach unten, um die Antwort von Clifford Dibble zu lesen: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/d4e763fd-13ee-40a2-9ace-443df609fbdf/rowguidcol Im Wesentlichen Es kennzeichnet nur die Spalte, so dass es generisch über $ ROWGUID referenziert werden kann. –

Antwort

2

Es scheint nicht, dass die ROWGUIDCOL Eigenschaft kann direkt über Entity Framework festgelegt werden, aber es könnte möglich sein, das Objekt in die Erzeugung von SQL zu injizieren durch „kreativ“ ;-) Nutzung des Speichertyp Parameters machen (unter der Annahme, Mit storeType können Sie den Standarddatentyp wirklich überschreiben. Beginnend mit dem Code aus der ursprünglichen Frage, versuchen, etwas wie folgt aus:

CreateTable(
      "dbo.Document", 
      c => new 
       { 
        RowGuid = c.Guid(nullable: false, identity: true, 
            defaultValueSql: "newid()", 
            storeType: "UNIQUEIDENTIFIER ROWGUIDCOL"), 
        Person_Id = c.Int() 
       }) 
      .Index(t => t.RowGuid, true); 

Leider habe ich keine Möglichkeit, dies zu testen, aber wenn man bedenkt, dass die folgenden SQL funktioniert, ich denke, es lohnt sich ein Schuss:

CREATE TABLE dbo.Test1 
(
    Col1 INT NOT NULL, 
    Col2 UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWID() 
) 

die „einzigartig“ Anforderung wird über einen eindeutigen Index durch den zweiten Parameter ist „true“ im Index() Methode erstellt erreicht.

Bitte beachten Sie, dass in der Guid() - Methode möglicherweise ein Problem mit "identity: true" auftritt, wenn die Tabelle bereits eine mit IDENTITY markierte Spalte enthält. Ich fand diese verwandte Frage, die diese Situation anspricht: Entity Framework Code First Using Guid as Identity with another Identity Column

+0

Dies funktioniert nicht. Es erzeugt "Spalte, Parameter oder Variable # 4: Kann den Datentyp UNIQUEIDENTIFIER ROWGUIDCOL nicht finden." –

+0

@DanielHilgarth Odd. Ist es möglich, dass neuere Versionen von EF eine Validierung durchführen, die in der Version, die der O.P. verwendet hat, nicht vorhanden war? Diese Frage und Antwort sind 3 Jahre alt, also hat sich möglicherweise etwas geändert? Welche Version verwenden Sie, nur als Referenz? –

+0

Möglicherweise, ja. Ich benutze EF6 –

2

Nach einigen Nachforschungen und Fragen, glaube ich nicht, dass es möglich ist. So wie ich um ihn herum habe in meinem Code ist eine neue GUID zu erhalten, wenn ich ein Objekt neu auf:

public class MyPOCO { 
      public MyPOCO() { 
       RowGuid = Guid.NewGuid(); 
      } 
     //..... 
    } 

Auf diese Weise bin ich immer eine neue GUID zu erzeugen, wenn ich eine neue Zeile in die Tabelle einfügen . Ich vermisse ROWGUIDCOL, aber EF macht mein Leben einfach.

+1

Dies kann eine Art schlechte Idee aufgrund der Fragmentierung Fragmentierung sein. Sie möchten, dass es NEWSEQUENTIALID() in dem Mssql-Server verwendet, die es ausführen wird, wenn Sie es als Identität festlegen ([DatabaseGenerated (System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]). Glücklicherweise können Sie einfach eine Migration verwenden: Sql ("ALTER TABLE Mytable ALTER COLUMN Meine Spalte ADD ROWGUIDCOL"); –