2013-06-26 12 views
11

considerare questo codice di migrazione:Come è possibile specificare la proprietà ROWGUIDCOL nella colonna Tipo Guid nel codice prima o con ColumnBuilder?

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

voglio il RowGuid essere ROWGUIDCOL, e saranno qualificate come questo (SQL):

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

Qual è il codice equivalente in EntityFramework/CodeFirst? Qual'è la soluzione?

Grazie.

+0

qualcuno ha ancora una soluzione a questo? Sono bloccato su questo problema. –

+0

btw .. cosa fa rowguidcol? –

+1

@vishalsharma, vai al seguente link e scorri verso il basso per leggere la risposta di Clifford Dibble: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/d4e763fd-13ee-40a2-9ace-443df609fbdf/rowguidcol Essenzialmente semplicemente contrassegna la colonna in modo che possa essere referenziata genericamente tramite $ ROWGUID. –

risposta

2

Non sembra che la proprietà ROWGUIDCOL può essere impostata direttamente tramite Entity Framework, ma potrebbe essere possibile iniettare la proprietà in SQL generare facendo "creativo" ;-) utilizzo del parametro StoreType (supponendo storeType consente veramente di ignorare il tipo di dati predefinito). A partire con il codice dalla domanda iniziale, provare qualcosa di simile al seguente:

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

Purtroppo, non ho un modo per testare questo, ma dato che i seguenti lavori SQL, penso che vale la pena di un colpo:

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

il requisito "uNICA" avviene tramite un indice univoco creato dal secondo parametro essere "vero" nel metodo index().

Si noti che potrebbe esserci qualche problema nell'utilizzo di "identity: true" nel metodo Guid() se la tabella ha già una colonna contrassegnata con IDENTITY. Ho trovato questa domanda correlata che risolve tale situazione: Entity Framework Code First Using Guid as Identity with another Identity Column

+0

Questo non funziona. Produce "Colonna, parametro o variabile # 4: Impossibile trovare il tipo di dati UNIQUEIDENTIFIER ROWGUIDCOL." –

+0

@DanielHilgarth Dispari. È possibile che le versioni più recenti di EF convalidino che non erano presenti nella versione che O.P. stava usando? Questa domanda e risposta hanno 3 anni, quindi forse qualcosa è cambiato? Quale versione stai usando, solo per riferimento? –

+0

Forse, si. Sto usando EF6 –

2

Dopo alcune ricerche e domande in giro, non penso sia possibile. Il modo in cui ho ottenuto intorno ad esso nel mio codice è quello di ottenere un nuovo GUID quando New un oggetto:

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

In questo modo, sono sempre generare un nuovo GUID quando inserisco una nuova riga nella tabella . Mi manca usare ROWGUIDCOL ma EF rende la mia vita semplice.

+1

Questa può essere una specie di cattiva idea a causa del problema della frammentazione dei guid. Si desidera che utilizzi NEWSEQUENTIALID() nel server mssql, che eseguirà se lo si imposta come identità ([DatabaseGenerated (System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]). Fortunatamente puoi semplicemente usare una migrazione: Sql ("ALTER TABLE mytable ALTER COLUMN mycolumn ADD ROWGUIDCOL"); –