2012-05-23 13 views
5

Mi piacerebbe avere una colonna CreatedDate nel mio Accounts tavolo, definito come segue:Come utilizzare il database predefinito per la colonna CreatedDate in EF code-first 4.3?

CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE() 

Ciò mappare a una proprietà CreatedDate nella classe:

public class Account 
{ 
    public DateTime? CreatedDate { get; private set; } 
    // ... other properties ... 
} 

Quando si crea un nuovo account Mi piacerebbe lasciare CreatedDate impostato su NULL e lasciare che sia il database a riempirlo. Quando carico un account esistente dal DB, vorrei che EF recuperi il CreatedDate generato dal database.

Sto utilizzando EF 4.3 code-first con migrazioni esplicite. Quando EF generato una migrazione di tabella Conti, ho modificato come segue:

CreatedDate = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"), 

Sfortunatamente, quando si tenta di mappare la tabella utilizzando EF 4.3, EF tenta di inserire il valore NULL nella colonna CreatedDate.

Ho provato a impostare DatabaseGeneratedOption.Identity per la proprietà, as suggested by Ladislav Mrnka. Tuttavia, ciò rimuove l'opzione di identità dalla proprietà della chiave primaria. Ho provato a utilizzare DatabaseGeneratedOption.Computed invece, ma continua a provare a inserire un NULL. Ho ripristinato tutte le migrazioni e le rieseguo - il problema si verifica ancora.

Ecco quello che sto facendo in OnModelCreating:

modelBuilder.Entity<Account>().Property(a => a.CreatedDate) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

Qualcuno ha qualche suggerimento?

Grazie per il vostro aiuto,
Richard

risposta

4

Fai la data non annullabili in entità o nullable nel database. Il valore predefinito del database viene utilizzato solo se l'istruzione insert non invia un valore esplicito. In caso di EF questo accade solo se contrassegni il tuo CreatedDate con DatabaseGeneratedOption.Identity. Se rimuove l'identità predefinita dalla chiave primaria, forzarla manualmente tramite annotazioni di dati o API fluente.

+0

Grazie Ladislav! Funziona. Ho contrassegnato CreatedDate e la mia colonna ID sia con DatabaseGeneratedOption.Identity. L'ho lasciato come nullable nella mia entità e non annullabile nel DB - ma con l'opzione Identity, non sta più inserendo il NULL esplicito. –

Problemi correlati