2009-11-05 28 views
22

Ho un'applicazione ASP.NET MVC in cui sto modificando un database esistente per aggiornare un campo paticolare, DateTime. Il mio database ha 4 campi, due dei quali sono DateCreated e DateModified. Quando provo ad aggiornare il campo, voglio continuare a DateCreated tempo stesso, alcun motivo per aggiornare la data di creazione, ed a cambiare il tempo DateModified per l'ora corrente utilizzando DateTime.NowLa conversione di un tipo di dati datetime2 in un tipo di dati datetime ha provocato un valore fuori intervallo

Ecco il codice data solo nel caso sto facendo qualcosa di sbagliato. Questa è la prima volta che utilizzo ASP.NET MVC, quindi sii gentile. Ho visto altre risposte in cui è stato chiamato Context, ma non riesco a trovare alcun riferimento ad esso. Quando eseguo l'applicazione, ricevo il messaggio di errore nel titolo e lo contractEntity.SaveChanges() è in rosso.

public ActionResult Edit(Contract editContract) { 
var contract = (from c in contractEntity.Contracts where c.Id == editContract.Id select c).First(); 
if (!ModelState.IsValid) 
    return View(contract); 
// editContract.DateCreated = contract.DateCreated; 
// editContract.DateModified = DateTime.Now; 
    contractEntity.ApplyCurrentValues(contract.EntityKey.EntitySetName, editContract); 
    contractEntity.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

Per favore, qualsiasi aiuto è apprezzato. Grazie.

+0

Credo che da quando questo post è stato scritto, la modifica dell'EDMX a mano non è la risposta. Quello pubblicato nel 2011 è un candidato più probabile di Jamiegs. – OmegaMan

risposta

19

Dopo aver letto this website ho trovato per aprire il file .edmx per il mio database e il cambiamento:

<...Provider="System.Data.SqlClient" ProviderManifestToken="2008".../> 

a

<...Provider="System.Data.SqlClient" ProviderManifestToken="2005".../> 

Questo è accettabile o c'è un approccio migliore per fissare tale errore?

+0

Quale sito Web? ... –

+0

http://ifunky.net/post/Type-datetime2-is-not-a-defined-system-type-Entity-Framework.aspx Siamo spiacenti, sarebbe stato utile se avessi postato . –

+5

Questa modifica impedisce all'EF di utilizzare il tipo DATETIME2. È la soluzione corretta per la tua app? Solo tu puoi dirlo. Se intendi utilizzare DATETIME2, pianificale. –

38

Per me, ho avuto lo stesso problema, ma il problema era che, per impostazione predefinita, quando salvavo il mio modello, veniva creato un DateTime non valido. Avevo un campo CreatedOn e non l'avevo impostato su nulla, il che significava che il valore era 01/01/0001 che era un DateTime non valido per SQL. Impostandolo mi sono liberato del problema.

+2

Mi chiedo perché ancora EF 4.3 Code-First crea un campo datetime per un database SQL Server 2008 R2 invece di datetime2. – IsmailS

12

È anche possibile modificare il modello (o in EF in .edmx) e impostare lo StoreGeneratedPattern su Calcolato per il campo in questione. Ciò causerà non salvarlo in quel campo, perché viene calcolato dal server SQL.

+0

In questo modo funziona meglio in questo caso. Basta essere consapevoli del fatto che * solo * funziona se si dispone di un valore predefinito specificato nel database. Poiché la domanda riguarda DateCreated e DateModified, queste saranno probabilmente impostate come 'DEFAULT GETDATE()' – CrazyPyro

6

Ho lo stesso errore e ho scoperto che se si dispone di un DB SQL 2008 con un campo DateTime Nullable, NON assegnare esplicitamente Null (Nothing) al campo nel codice, questo causerà questo errore, oppure può cambiare tutti i campi DateTime in DateTime2.

3

Basta usare un DateTime nullable come DateTime? nella proprietà dell'entità del dominio se la colonna nel database può essere annullabile. Questo lo farà funzionare.

Problemi correlati