2013-06-26 7 views
11

Rozważmy ten kod migracji:W jaki sposób można określić właściwość ROWGUIDCOL do kolumny typu Guid w kodzie pierwszym lub z 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); 

chcę RowGuid być ROWGUIDCOL, a być zdefiniowane następująco (SQL):

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

Co jest odpowiednikiem kodu w EntityFramework/CodeFirst? Jakie jest rozwiązanie?

Dzięki.

+0

Ktoś ma rozwiązanie jeszcze do tego? Jestem zablokowany w tej właśnie sprawie. –

+0

btw .. co robi rowguidcol? –

+1

@vishalsharma, przejdź do następującego łącza i przewiń w dół, aby przeczytać odpowiedź Clifforda Dibble'a: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/d4e763fd-13ee-40a2-9ace-443df609fbdf/rowguidcol Zasadniczo po prostu oznacza kolumnę, aby można było uzyskać ogólne odniesienie za pomocą $ ROWGUID. –

Odpowiedz

2

Nie wydaje się, że nieruchomość ROWGUIDCOL można ustawić bezpośrednio za pomocą Entity Framework, ale może można wstrzyknąć właściwość do wygenerowania SQL poprzez „twórczy” ;-) użycie parametru storeType (zakładając, storeType naprawdę pozwala na zastąpienie domyślnego typu danych). Począwszy od kodu z oryginalnego pytanie, spróbuj coś jak następuje:

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

Niestety, nie ma sposobu, aby przetestować ten, ale biorąc pod uwagę, że następujące prace SQL, myślę, że warto spróbować:

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

tego „szczególnego” wymaganie jest realizowane przez indeks unikalny utworzonej przez drugi parametr jest „true” w sposób Index().

Należy pamiętać, że może wystąpić problem z "identity: true" w metodzie Guid(), jeśli tabela ma już kolumnę oznaczoną TOŻSAMOŚĆ. Znalazłem to pokrewne pytanie, które odnosi się do tej sytuacji: Entity Framework Code First Using Guid as Identity with another Identity Column

+0

To nie działa. Tworzy "kolumnę, parametr lub zmienną nr 4: Nie można znaleźć typu danych UNIQUEIDENTIFIER ROWGUIDCOL." –

+0

@DanielHilgarth Odd. Czy jest możliwe, że nowsze wersje EF sprawdzają poprawność, której nie było w wersji używanej przez O.P.? To pytanie i odpowiedź mają 3 lata, więc prawdopodobnie coś się zmieniło? Jakiej wersji używasz, tylko w celach informacyjnych? –

+0

Prawdopodobnie tak. Używam EF6 –

2

Po kilku badaniach i pytaniu, nie sądzę, że to możliwe. Sposób mam wokół niego w moim kodu jest uzyskanie nowego identyfikatora GUID, kiedy się nowy obiekt:

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

w ten sposób, ja zawsze generowania nowego identyfikatora GUID kiedy wstawić nowy wiersz do tabeli . Tęsknię za używaniem ROWGUIDCOL, ale EF sprawia, że ​​moje życie jest proste.

+1

Może to być zły pomysł ze względu na problem fragmentacji guid. Chcesz go używać NEWSEQUENTIALID() na serwerze mssql, co zrobi, jeśli ustawisz go jako tożsamość ([DatabaseGenerated (System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]). Na szczęście możesz po prostu użyć migracji: Sql ("ALTER TABLE mytable ALTER COLUMN mycolumn ADD ROWGUIDCOL"); –