2009-10-22 14 views
12

W moim SQL schematu bazy danych serwera Mam tabelę danych z zakresu dat, który zawiera wartość domyślnąJak używać domyślnego Entity Framework i domyślną datę wartości

CONVERT(VARCHAR(10), GETDATE(), 111) 

który jest idealny do automatycznego wstawiania daty do nowego rekordu przy ręcznym wprowadzaniu rekordów do bazy danych.

Problem polega na tym, że podczas korzystania z Entity Framework i mapowania pola Date, Entity Framework wstawia domyślną wartość DateTime.Min, gdy jednostka jest tworzona.

Nie mogę odwzorować pola daty na wartość zerową DateTime, tzn. DateTime ?, ani też nie można użyć opcji CONVERT lub DateTime.Now.Today w domyślnej wartości Entity Designer, ponieważ akceptuje tylko stałe wartości stałe .

Oczywiście mogę jawnie ustawić pole DateTime w C# za każdym razem, gdy obiekt zostanie utworzony, jawnie w kodzie, w konstruktorze klasy częściowej lub nawet podczas zapisywania zmian.

Czy istnieją inne sposoby osiągnięcia tego, co chcę, gdy zamiast tego używane jest domyślne obliczenie wartości przechowywane w tabeli bazy danych?

+0

Możesz spróbować ustawić pole jako wygenerowane automatycznie. Nigdy tego nie próbowałem i nie jestem pewien, jak dobrze by to działało. –

+0

Rozejrzałem się po projekcie EDM i nie widziałem żadnych opcji, elementów menu ani właściwości, które mogłem opisać jako oferowanie tego. Gdzie znajdę "ustawione pole jako wygenerowane automatycznie" w projektancie? Zakładam, że odwołujesz się do projektanta, a nie do czegoś w SQL Server. A może masz na myśli "obliczoną specyfikację kolumny?" – Justin

+1

http://msdn.microsoft.com/en-us/library/dd296755.aspx –

Odpowiedz

1

Właśnie wpadłem na to - pracowałem nad nim, ustawiając datę (pole, które potrzebowałem wygenerować automatycznie) w konstruktorze Jednostki za pomocą metody częściowej. To, czy jest to Idealne, czy też działa we wszystkich przypadkach, jeszcze nie zostało zauważone, ale jak dotąd rozwiązało to mój problem.

+1

To jest rozwiązanie, które w końcu wybrałem. Wydaje się trochę kludge, ale działa bezbłędnie. Szkoda, że ​​takie niedopatrzenie jest obecne w EF. – Justin

+0

Cieszę się, że pomogłem, pozwól, że EF4 naprawi ten ból. Jeśli uważasz, że jest to najlepsze rozwiązanie, które prawdopodobnie znajdziesz, proszę oznaczyć je jako odpowiedź (lub przynajmniej upuść je), aby uzyskać trochę kredytu - staram się zbudować co najmniej wystarczającą liczbę przedstawicieli, aby bardziej aktywnie korzystać z tej witryny . Dzięki! –

+1

Zrobiłbym to, ale wymaga to 15 reputacji. Przepraszam. – Justin

5

Można użyć wartości database trigger, która po wstawieniu sprawdza, czy wstawiona wartość to DateTime.MinValue (01.01.0001) i zastępuje ją żądaną wartością obliczeniową. Ten MSDN article opisuje, jak utworzyć wyzwalacz.

Mała "usterka": dzięki temu rozwiązaniu będziesz musiał zapisać nowy obiekt w bazie danych i przeczytać go później, aby zaktualizować obiekt o obliczoną wartość.

+2

Dobra uwaga. To też by działało. Ale wydaje mi się, że dzierżę młot, żeby rozłupać orzech. – Justin

0

Pole daty można odwzorować na DateTime? tylko jeśli kolumna jest zerowa w bazie danych.

+0

Ale jeśli kolumna jest zerowa, to logika nakazuje, że nie można mieć "wartości domyślnej". I to jest zachowanie ujawnione przez serwer SQL. – Justin

14

Utwórz klasę częściową dla obiektu EntityObject, dodaj domyślny konstruktor i ustaw wartości domyślne w nim.

public partial class YourDBObject 
    { 
      public YourDBObject() 
      { 
       this._DateField = DateTime.Now; 
      } 
    } 
+0

Dokładnie to, czego potrzebowałem (choć nie na to pytanie)! : D – nathanchere

+3

Dzięki. Działa to, chociaż początkowo mnie pomyliłem, ponieważ konstruktor jest również wywoływany, gdy istniejące obiekty są pobierane z bazy danych - jednak w takich przypadkach 'DateTime.Now' zostaje nadpisany wartościami bazy danych po zakończeniu budowy. – codeulike

1

Miałem podobny problem z wykorzystaniem usług RIA z Entity Framework. Nie byłem w stanie ustawić wartości w domyślnym konstruktorze po stronie klienta, ponieważ wygenerowane tam klasy encji mają już pusty konstruktor domyślny.

Rozwiązaniem, którego użyłem, było zaimplementowanie metody częściowej OnCreated dla jednostki na kliencie poprzez ustawienie wymaganej wartości domyślnej.

2

To bardzo niefortunne. Odpowiedzi odnoszące się do StoreGeneratedPattern nie są prawdziwym rozwiązaniem, które nie pozwala na ustawienie wartości.

Cały zespół będzie musiał zrobić coś takiego:

[Required] 
    [DefaultValue] // suggested attribute, whatever you want to call it 
    public DateTime Created { get; set; } 

Jeśli pole jest zaznaczone DefaultValue, a następnie w czasie generacji SQL EF, właściwości z tym atrybutem się sprawdzić czy field == default(DateTime), jeśli tak, to po prostu pomiń tę kolumnę z wygenerowanego kodu.

0

Właśnie zdarzyło się przejść przez ten problem. Entity Framework nie obsługuje samodzielnie wartości domyślnych. Musisz ustawić właściwość StoreGeneratedPattern = Computed w kolumnie w elemencie pliku Edmx. Domyślna wartość ustawiona w bazie danych będzie miała pierwszeństwo przed tym, co EF ustawi domyślnie, np. DateTime.Min

Powiązane problemy