Mam tabelę, która przechowuje jakieś dodatkowe dane dla niektórych wierszach tabeli, takich jak:Entity Framework Code First Migracje: Set Primary Key Value
public class QuoteExtra
{
[Key]
public int QuoteId { get; set; }
// More fields here
}
Chciałbym, aby móc dodać wiersze do tabeli gdzie wyraźnie ustawiłem PK.
Jeśli po prostu pozostawię to tak jak powyżej, ustawienie wartości i przesłanie wiersza powoduje, że wartość zostanie odrzucona i zastąpiona wartością wygenerowaną automatycznie z bazy danych (a kolumna jest zdefiniowana jako kolumna Tożsamość w rzeczywistym schemacie).
To wydaje się być dobrym rozwiązaniem:
public class QuoteExtra
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int QuoteId { get; set; }
// More fields here
}
Jednak zamiast tego dostaje mi wyjątek:
Nie można wstawić wyraźną wartość dla kolumny tożsamości w tabeli „EnumTest” kiedy IDENTITY_INSERT jest ustawiony na POZA.
Jak więc napisać moją klasę, aby móc ustawić wartość klucza podstawowego w EF?
Edit:
Próbowałem dodanie następującego migracji kodu opartego ustawić IDENTITY_INSERT ON:
public override void Up()
{
Sql("SET IDENTITY_INSERT QuoteExtra ON");
}
Pobiegłem go i spróbował jeszcze raz, ale mam ten sam wyjątek jak wyżej. Dziwne jest to, że baza danych odzwierciedla to ustawienie, a bezpośrednie działanie SQL przeciwko niemu pozwala mi wstawiać dowolne wartości dla klucza podstawowego - więc wyglądałoby na to, że Entity Framework sam egzekwuje tę regułę i zaniedbuje rozpoznanie, że IDENTITY_INSERT nie jest fakt ustawiony na off. Czy muszę ustawić go gdzieś w samym EF?
Edit 2:
ja źle IDENTITY_INSERT; Zakładałem, że ustawiam go po raz pierwszy na tym stole na czas nieokreślony. W rzeczywistości żyje tak długo, jak "Sesja", co oznacza, że na przykład ustawienie Migracji oznacza, że ona żyje ... tak długo jak ta migracja działa i nie ma wpływu na przyszłe połączenia, takie jak moja później .Add() z EF , co wyjaśnia, dlaczego wciąż mam ten wyjątek - DB jest naprawdę źródłem wyjątku, a nie EF. Ponieważ IDENTITY_INSERT jest ograniczona do co najwyżej jednej tabeli na sesję, jest to dość nieefektywny sposób - nie tworzenie kolumny Identity PK na pierwszym miejscu wydaje się lepszą trasą.
Co masz na myśli przez * Co dziwne jest baza danych nie odzwierciedla tego ustawienia? * –
Co miałem na myśli to, że byłem w stanie wstawić wartości, jeśli użyłem surowego SQL, aby to zrobić po uruchomieniu polecenia identity_insert na - ale teraz widzę dlaczego - to dlatego, że ustawienie jest włączone dla długości sesji i w surowym SQL w Sql Server Management Studio pozostałam w zasięgu sesji, podczas gdy moja migracja EF i następujący po niej kod testowy są osobnymi sesjami. –
Tak. Wkład identyfikacyjny jest powiązany z połączeniem. Jeśli upewnisz się, że twój kod działa w ramach tego samego połączenia, powinieneś móc z niego korzystać. Ale jest to jakaś czarna magia, szczególnie biorąc pod uwagę migracje. –