czy istnieje „elegancki” sposób nadania określonej właściwości wartości domyślnej?
Może przez DataAnnotations coś takiego:
[DefaultValue("true")]
public bool Active { get; set; }
Dziękuję Ci.
entity-framework
ef-code-first
default-value
marino-krk
źródło
źródło
this.Active = true;
? Myślę, że wartość DB będzie miała pierwszeństwo podczas pobierania, ale uważaj, jeśli new'ing, a następnie dołączenie encji do aktualizacji bez pobierania najpierw, ponieważ śledzenie zmian może postrzegać to jako chęć aktualizacji wartości. Skomentuj, ponieważ nie używałem EF od dawna i wydaje mi się, że to strzał w ciemność.public bool Inactive { get; set; }
😉Odpowiedzi:
Możesz to zrobić, ręcznie edytując pierwszą migrację kodu:
źródło
Active
dotrue
podczas tworzeniaEvent
obiektu, jak również. Domyślną wartością zawsze jestfalse
właściwość bool, która nie ma wartości null, więc jeśli nie zostanie zmieniona, to właśnie struktura encji zapisze w db. A może coś mi brakuje?Minęło trochę czasu, ale pozostawiając notatkę innym. Osiągnąłem to, co jest potrzebne z atrybutem i ozdobiłem pola mojej klasy modelem tym atrybutem, jak chcę.
Otrzymałem pomoc z tych 2 artykułów:
Co ja zrobiłem:
Zdefiniuj atrybut
W „OnModelCreating” kontekstu
W niestandardowym SqlGenerator
Następnie w konstruktorze konfiguracji migracji zarejestruj niestandardowy generator SQL.
źródło
[SqlDefaultValue(DefaultValue = "getutcdate()")]
każdego elementu. 1) Po prostu usuńmodelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));
2) DodajmodelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
Powyższe odpowiedzi naprawdę pomogły, ale dostarczyły tylko część rozwiązania. Głównym problemem jest to, że jak tylko usuniesz atrybut Wartość domyślna, ograniczenie kolumny w bazie danych nie zostanie usunięte. Tak więc poprzednia wartość domyślna pozostanie w bazie danych.
Oto pełne rozwiązanie problemu, w tym usunięcie ograniczeń SQL przy usuwaniu atrybutów. Używam również natywnego .NET Framework
DefaultValue
atrybutu .Stosowanie
Aby to zadziałało, musisz zaktualizować IdentityModels.cs i Configuration.cs pliki
Plik IdentityModels.cs
Dodaj / zaktualizuj tę metodę w swojej
ApplicationDbContext
klasiePlik Configuration.cs
Zaktualizuj
Configuration
konstruktor klasy, rejestrując niestandardowy generator Sql:Następnie dodaj niestandardową klasę generatora Sql (możesz dodać ją do pliku Configuration.cs lub osobnego pliku)
źródło
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
atrybut? Jeśli tak, to dlaczego? W moich testach wydawało się, że nie ma żadnego efektu, pomijając to.Właściwości modelu nie muszą być „właściwościami automatycznymi”, chociaż jest to łatwiejsze. A atrybut DefaultValue jest tak naprawdę tylko informacyjnymi metadanymi. Przyjęta tutaj odpowiedź jest jedną z alternatyw dla podejścia konstruktora.
vs.
Będzie to działać tylko w przypadku aplikacji tworzących i konsumujących dane przy użyciu tej konkretnej klasy. Zwykle nie stanowi to problemu, jeśli kod dostępu do danych jest scentralizowany. Aby zaktualizować wartość we wszystkich aplikacjach, należy skonfigurować źródło danych, aby ustawić wartość domyślną. Odpowiedź Devi pokazuje, jak można to zrobić za pomocą migracji, sql lub dowolnego języka, w którym mówi twoje źródło danych.
źródło
To, co zrobiłem, zainicjowałem wartości w konstruktorze encji
Uwaga: atrybuty DefaultValue nie ustawią wartości twoich właściwości automatycznie, musisz to zrobić sam
źródło
Po komentarzu @SedatKapanoglu dodałem całe moje podejście, które działa, ponieważ miał rację, samo używanie płynnego API nie działa.
1- Utwórz niestandardowy generator kodu i przesłoń Generuj dla modelu ColumnModel.
2- Przypisz nowy generator kodu:
3- Użyj płynnego interfejsu API, aby utworzyć adnotację:
źródło
To proste! Po prostu adnotuj z wymaganymi.
wynikowa migracja będzie:
Jeśli chcesz mieć wartość true, zmień wartość defaultValue na true w migracji przed aktualizacją bazy danych
źródło
true
?Przyznaję, że moje podejście wymyka się całej koncepcji „Code First”. Ale jeśli masz możliwość zmiany domyślnej wartości w samej tabeli ... jest to o wiele prostsze niż długości, które musisz pokonać powyżej ... Jestem po prostu zbyt leniwy, aby wykonać całą tę pracę!
Wygląda na to, że oryginalny pomysł na plakaty zadziałałby:
Myślałem, że popełniali błąd, dodając cytaty ... ale niestety nie ma takiej intuicyjności. Inne sugestie były dla mnie po prostu za dużo (oczywiście, mam uprawnienia potrzebne do wejścia do tabeli i wprowadzenia zmian ... gdzie nie każdy programista zrobi to w każdej sytuacji). W końcu zrobiłem to po prostu w staromodny sposób. Ustawiam wartość domyślną w tabeli SQL Server ... Mam na myśli naprawdę, już dość! UWAGA: Następnie przetestowałem, wykonując migrację dodatków i aktualizację bazy danych, a zmiany utknęły.
źródło
Po prostu przeciąż domyślnego konstruktora klasy Model i przekaż dowolny odpowiedni parametr, którego możesz użyć lub nie. Dzięki temu można łatwo podać wartości domyślne dla atrybutów. Poniżej znajduje się przykład.
źródło
Rozważmy, że masz nazwę klasy o nazwie Produkty i masz pole IsActive. potrzebujesz konstruktora tworzenia:
Zatem domyślną wartością IsActive jest Prawda!
Edycja :
jeśli chcesz to zrobić za pomocą SQL, użyj tego polecenia:
źródło
W rdzeniu EF wydanym 27 czerwca 2016 r. Możesz używać płynnego API do ustawiania wartości domyślnej. Przejdź do klasy ApplicationDbContext, znajdź / utwórz nazwę metody OnModelCreating i dodaj następujący płynny interfejs API.
źródło
W .NET Core 3.1 możesz wykonać następujące czynności w klasie modeli:
W DbContext OnModelCreating dodajesz wartość domyślną.
W wyniku tego w bazie danych
Uwaga: jeśli nie masz wartości zerowej (bool?) Dla swojej właściwości, otrzymasz następujące ostrzeżenie
źródło
Przekonałem się, że wystarczy użyć Autoinicjatora właściwości dla właściwości encji, aby wykonać zadanie.
Na przykład:
źródło
Hmm ... najpierw wykonuję DB, aw takim przypadku jest to o wiele łatwiejsze. EF6 prawda? Po prostu otwórz model, kliknij prawym przyciskiem myszy kolumnę, dla której chcesz ustawić wartość domyślną, wybierz właściwości, a zobaczysz pole „DefaultValue”. Po prostu wypełnij i zapisz. Ustawi dla ciebie kod.
Twój przebieg może się różnić w zależności od kodu, ale nie pracowałem z tym.
Problem z wieloma innymi rozwiązaniami polega na tym, że chociaż mogą one działać początkowo, to zaraz po przebudowaniu modelu wyrzucą one dowolny niestandardowy kod wstawiony do pliku generowanego maszynowo.
Ta metoda działa poprzez dodanie dodatkowej właściwości do pliku edmx:
I dodając niezbędny kod do konstruktora:
źródło
Ustaw wartość domyślną dla kolumny w tabeli na serwerze MSSQL, aw kodzie klasy dodaj atrybut, jak poniżej:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
dla tej samej nieruchomości.
źródło