2013-06-11 15 views
5

Kiedy jestem zapisywania zmian do bazy danych, biegnę w następującym wyjątkiem:Entity Framework 6 Kod Pierwsza wartość domyślna datetime na wkładce

Cannot insert the value NULL into column 'Registered', table 
'EIT.Enterprise.KMS.dbo.LicenseEntry'; column does not allow nulls. 
INSERT fails. The statement has been terminated. 

dany przepis pierwszą nieruchomość wzór wygląda następująco:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember] 
public DateTime   Registered   { get; private set; } 

... a oto dlaczego jestem zdezorientowany: o ile wiem, dostarczając adnotacji [DatabaseGenerated(DatabaseGeneratedOption.Identity) jestem zamawiania Entity Framework do automatycznego generowania pola (w tym przypadku: tylko raz w momencie tworzenia .)

Spodziewam się więc, że pole nie będzie podlegało zerowaniu (wymagane), bez możliwości ręcznego zmieniania pola, w którym zajmuje się EF.

Co robię źle?


Uwagi:

  1. Nie chcę użyć Fluent-API, jak chcę użyć Poços.
  2. Właściwość defaultValueSql również nie jest opcją, ponieważ muszę polegać na bazie danych niezależnej dla tego projektu (np. Dla GETDATE()).
  3. Używam Entity Framework 6 alpha 3, Code First.
+0

Czy AutoGenerate jest również kluczem podstawowym? Jeśli tak, musisz podać adnotację [key]. – Botonomous

+0

Nie. To tylko własność. – Atrotygma

+1

Nie wierzę, że typ danych DateTime ma obsługę atrybutu pola tożsamości. – marcellscarlett

Odpowiedz

3

Spróbuj tego:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember] 
public DateTime?   Registered   { get; private set; } 

Znak zapytania sprawia właściwość zerowalne

+0

Próbowałem Twojego rozwiązania, ale wygląda na to, że działa, ale powinno. Za każdym razem, gdy generuję skrypt migracji, pole zostanie oznaczone w skrypcie jako "nullable: false".Nawet przy tworzeniu bazy danych. Co może być nie tak? Prywatny zestaw? – Atrotygma

2

Technika ta zachowuje się jak readonly polu, które jest zachowywane w bazie danych. Po ustawieniu wartości nie można (łatwo) zmienić za pomocą kodu. (Oczywiście, w razie potrzeby zmienić setter do public lub internal.)

Podczas tworzenia nowej instancji klasy, która używa tego kodu Registered nie będzie wstępnie ustalona. Za pierwszym razem, gdy żądana jest wartość Registered, zobaczysz, że nie została ona przypisana, a następnie domyślnie DateTime.Now. W razie potrzeby możesz to zmienić na DateTime.UTCNow.

Podczas pobierania jednej lub więcej jednostek z bazy danych Entity Framework ustawi wartość Registered, w tym private setery takie jak ta.

private DateTime? registered; 
[Required] 
public DateTime Registered 
{ 
    get 
    { 
     if (registered == null) 
     { 
      registered = DateTime.Now; 
     } 
     return registered.Value; 
    } 
    private set { registered = value; } 
} 
Powiązane problemy