19

mam:EF 5. „automatyczna migracja nie była stosowana, ponieważ byłoby to spowodować utratę danych” - tylko zmienił nazwę kolumny

AutomaticMigrationsEnabled = True 
AutomaticMigrationDataLossAllowed = False 

w moim pliku konfiguracyjnego i istniejący model:

Public Property ID() As Integer 
Public Property ERP_ArticleCode() As String 
Public Property description() As String 

Wszystko, co zrobiłem, to zmienić trzecią kolumnę z "description" na "am_description" i uruchomić "update-database -verbose", co spowodowało "Automatyczna migracja nie została zastosowana, ponieważ spowodowałaby utratę danych"!

Nie rozumiem tego ... dlaczego nie mogę po prostu zmienić nazwy kolumny i zaktualizować bazy danych - to nie powinien być problem z danymi, czy nie? czy robię coś źle?

+0

Skąd wiadomo, że zmieniasz kolumnę, a nie ją usuwasz i dodajesz nową? –

+0

Komentarz do targów. Jedynym sposobem, aby to naprawić, jest ręczne zmienienie metody "up" i uczynienie jej "alter column" zamiast "delete", a następnie "add"? – TheMook

Odpowiedz

17

Powinieneś edytować swoją metodę "w górę iw dół" i zamienić instrukcje AddColumn i DropColumn na RenameColumn.

EF nie może wykryć, czy zmieniasz nazwę kolumny, czy chcesz ją usunąć i utworzyć nową.

+2

Jeśli używasz programu SQL Server Compact, to nie zadziała. "Bezpośrednia zmiana nazwy kolumny nie jest obsługiwana przez SQL Server Compact.Aby zmienić nazwę kolumny w SQL Server Compact, musisz ją odtworzyć. " –

33

Ten kod poniżej nie jest konieczne, aby uruchomić migracji:

AutomaticMigrationsEnabled = True 
AutomaticMigrationDataLossAllowed = False 

I acording do tego artykułu (from entityframework codeplex), to błąd EF i można zignorować ten z -Force atrybutu w migracji.

Update-Database -Force 

lub

Update-Database -TargetMigration: X -Force 

To powinno rozwiązać problem.

IMO, powinieneś pozwolić EF decydować, co robi z twoimi kolumnami, tylko moja opinia.

+4

Naprawdę i naprawdę ** ignorujesz ** błąd z -Force lub AutomaticMigrationDataLossAllowed = True. Jest to * bardzo * niebezpieczna rzecz do umieszczenia w kodzie, który osiągnie produkcję. Bądź * pewien *, że chcesz zignorować problem, ponieważ możesz stracić dane produkcyjne, jeśli nie będziesz ostrożny. –

+0

@EricJ. ma rację, musisz uważać na te kody i NIE promować do produkcji bez wiedzy o tym, co robisz. –

2

I rozwiązać tak, wystarczy wpisać:

-Force Update Database

+9

Ale wszystko, co się dzieje, to wymuszenie utraty danych! Nie wyjaśnia ona, dlaczego struktura encji ma potrzebę utraty danych, co jest jasno wyjaśnione przez kirsten g. Po prostu przesłanianie i zmuszanie bazy danych do aktualizacji i utraty danych nie jest idealnym scenariuszem dla większości, które bym musiał. – TheMook

-5

Musisz zmienić linię

AutomaticMigrationDataLossAllowed = False 

do

AutomaticMigrationDataLossAllowed = True 

Uwaga: t Należy zachować ostrożność, aby używać go tylko w środowisku programistycznym, ponieważ może to spowodować utratę danych po wdrożeniu do produkcji.

+1

Nie. To jest tak jak dla powyższej odpowiedzi mejaiamanuel57. Wymuszenie bazy danych do usunięcia danych jest ukrywaniem. problem, a nie rozwiązanie ... Kirsten G doskonale wyjaśniła sytuację, nie można jej rozwiązać automatycznie, wymaga interwencji użytkownika w Kodzie EF i zamiast tego należy użyć 'RenameColumn'. – TheMook