2016-03-24 13 views
0

Ich habe ein ASP.NET Core-Projekt auf dem Sprung und ich habe EF7 hinzugefügt.EF7 DateTime "Angegebener Cast ist nicht gültig"

Es funktioniert alles gut mit SQL Server auf Amazon RDS, außer wenn ich ein DateTime-Feld zu meinem Modell hinzufügen und es auf die Datenbank migrieren.

Dann jedes Mal, nachdem ich mein Projekt neu starte und ich versuche, eine Entität (über DBContext und Linq) zu bekommen, bekomme ich eine wirklich, wirklich böse Ausnahmemeldung. Was könnte es an den DateTime-Werten sein, die es nicht mag?

Modellklasse:

public class Advertiser 
{ 
    // ... Standard constructors go here 

    [Key] 
    public string Key { get; set; } 
    public string Name { get; set; } 
    public bool IsActive { get; set; } 
    public string Email { get; set; } 
    public DateTime TargetDate { get; set; } 
    public string Comments { get; set; } 
} 

Kontext:

public class AdvertiserContext : DbContext 
{ 
    public DbSet<Advertiser> Advertisers { get; set; } 
} 

Codezeile in der Repository-Klasse, die die Ausnahme verursacht:

public Advertiser Find(string key) 
{ 
    return Context.Advertisers.Single(x => x.Key == key); 
} 

Zwei "gestapelt" Ausnahmen auftreten, die zuerst:

Microsoft.Data.Entity.Query.Internal.QueryCompiler[1] 
An exception occurred in the database while iterating the results of a query. 
System.InvalidCastException: Specified cast is not valid. 
at (wrapper dynamic-method) System.Object:lambda_method (System.Runtime.CompilerServices.Closure,Microsoft.Data.Entity.Storage.ValueBuffer) 

Und die zweite:

Microsoft.AspNet.Server.Kestrel[13] 
An unhandled exception was thrown by the application. 
System.InvalidCastException: Specified cast is not valid. 
at (wrapper dynamic-method) System.Object:lambda_method (System.Runtime.CompilerServices.Closure,Microsoft.Data.Entity.Storage.ValueBuffer 
+0

Fügen Sie Ihrem relevanten Modelle/code bitte –

+0

haben Sie Daten haben, die vor dem neuen Termin Feld hinzufügen? vielleicht haben diese Zeilen Nullwerte für das Datum, wenn ja, versuchen Sie, die Nullzeilen zu füllen –

+0

Sehr gute Schätzung, aber ich habe das mit Beispieldaten getestet und die Tabelle in der Datenbank zwischen den Tests gelöscht. Es schien nichts mit dem Hinzufügen neuer Spalten zu tun zu haben, und es gab niemals Nullwerte. – robbpriestley

Antwort

0

Datetime in SQL hat einen Minimalwert von 1753.01.01 12.00.00. Da Ihre TargetProperty nicht nullfähig ist, nehme ich an, dass Ihre Entität mit '0001/01/01 12:00:00 AM' initialisiert wird, was der minimale Wert für DateTime in der clr ist und außerhalb des Bereichs liegt, daher die Ausnahme, die Sie erhalten .

Sie haben zwei Möglichkeiten, das Problem zu lösen. Eine davon besteht darin, die Up-Methode oder das Mapping der Migration zu ändern und den Spaltendatentyp auf DateTime2 festzulegen. Die andere Möglichkeit besteht darin, TargetDate als Nullwert zu deklarieren. Folgende Schnipsel

modelBuilder.Entity<Advertiser>(entity => 
{  
    entity.Property(a => a.TargetDate) 
       .ForSqlServerHasColumnType("DateTime2"); 
}); 

oder

public DateTime? TargetDate { get; set; } 
+0

Ich fühle mich, als ob Sie auf etwas sind, weil der Code (und die Daten) schon beim ersten Durchlauf funktionieren. Wenn ich dann den Server stoppe und neu starte, beginnen die Ausnahmen, was darauf hindeutet, dass das Problem auf der Neuinitialisierung des Codes beruht. Hinzufügen der? "operator" für den DateTime-Typ führt zu einem Nullwert-Feld in der Datenbank, und in der Tat ist der entsprechende Datentyp DateTime2 automatisch, was den gewünschten Effekt darstellt. Leider ändert dies nicht das Ergebnis (die gleichen Ausnahmen auftreten). – robbpriestley

+0

Laufen Sie auf OSX oder Linux? –

+0

Ich betreibe OSX – robbpriestley

Verwandte Themen