2015-01-23 13 views
5

Używam EF 6.0 kod najpierw, i mam ten podmiot:Entity Framework Change Primary Key Type

public class TrainingRespect 
{ 
    [Key] 
    public int RespectId { get; set; } 

    public DateTime? DateWhenRespected { get; set; } 

    #region 

    public string UserId { get; set; } 
    public User User { get; set; } 

    public Guid TrainingId { get; set; } 
    public Trening Training { get; set; } 

    #endregion 
} 

I chciałbym zmienić to klucz podstawowy (RespectId) od int do GUID/string/długie.

Jaki jest najłatwiejszy sposób robienia tego? Czy mogę po prostu zmienić typ i migracje EF zajmie się wszystkim, czy powinno to być zrobione w jakiś inny sposób?

+0

Wygląda na to, że masz pomysł na coś, co możesz zrobić. Próbowałeś tego? Odpowiedź powinna brzmieć "tak". – JamesT

+0

@JTolley Nie, ponieważ byłem w 99% pewien, że odpowiedź brzmi "nie". Miałem złe doświadczenia wcześniej ze starszymi wersjami EF z tym. W każdym razie po przeczytaniu twojego komentarza próbowałem zmienić go z int na long i string, i za każdym razem dostałem ten błąd: 'Tabele bez indeksu klastrowanego nie są obsługiwane w tej wersji SQL Server. Utwórz indeks klastrowy i spróbuj ponownie. Nie można usunąć ograniczenia. Zobacz poprzednie błędy. Instrukcja została zakończona. " – hyperN

+0

Z której wersji programu SQL Server korzystasz? – JamesT

Odpowiedz

2

OK, aby odpowiedzieć na twoje pytanie. Tak można po prostu zmienić typ danych i Migracje powinny się tym zająć.

W oparciu o Twoje komentarze masz problem z zastosowaniem tej migracji. Nie neguje to powyższego, ale spróbuję pomóc przy odrobinie zgadywania.

Jeśli używasz Sql Azure, musisz mieć indeksy klastrowe we wszystkich tabelach. EF6 powinien tworzyć indeksy klastrowe nawet na kluczach strunowych. Występuje błąd związany z alfa 3, ale nie tworzy on klucza klastrowanego w tabeli migracji.

http://entityframework.codeplex.com/discussions/435723

Patrz powyższy link do opisu i obejście.

Jeśli nadal występują problemy, można uruchomić następujące polecenie z konsoli pakietu:

Update-Database -Script 

To będzie produkować skryptu SQL zamiast próbować aktualizować bezpośrednio. Możesz na to spojrzeć i sprawdzić, czy którekolwiek z instrukcji Create Table nie ma na nich indeksu klastrowego.

Jeśli z jakiegoś powodu nie ma. Można jawnie zmodyfikować instrukcję CreateTable w migracji, aby utworzyć klaster podstawowy.

CreateTable("MyTable", 
    c => new { 
     Id = c.String(nullable: false, maxLength: 128) 
    }) 
.PrimaryKey(t => t.Id, null, true); 

Warto również zauważyć: GUID dokonać strasznych klastrowe indeksy. Jeśli używasz kluczy GUID i masz opcję, nie klastruj na nich i zamiast tego masz drugi indeks klastrowy.

+2

Informacje: Wersja podglądu Azure w wersji V12 umożliwia korzystanie z tabel bez klastrowego indeksu http://azure.microsoft.com/en-gb/documentation/articles/sql-database-preview-whats-new/ – Colin

+0

Zmęczony naprawić błąd alpha 3, teraz spróbuję zaktualizować V12 i zobaczyć, co się stanie, a wtedy spróbuję z opcją -Script, dziękuję za twoje odpowiedzi – hyperN