469 Stimmen

Konvertierung eines datetime2-Datentyps in einen datetime-Datentyp führt zu einem Wert außerhalb des zulässigen Bereichs

Ich habe eine Datentabelle mit 5 Spalten, in der eine Zeile mit Daten gefüllt und dann über eine Transaktion in der Datenbank gespeichert wird.

Beim Speichern wird ein Fehler zurückgegeben:

Die Konvertierung eines datetime2-Datentyps in einen datetime-Datentyp führte zu einem Wert, der außerhalb des zulässigen Bereichs lag

Es impliziert, wie gelesen, dass mein datatable einen Typ von DateTime2 und meine Datenbank eine DateTime ; das ist falsch.

Die Datumsspalte wird auf ein DateTime wie diese:

new DataColumn("myDate", Type.GetType("System.DateTime"))

Frage

Kann dies im Code gelöst werden oder muss etwas auf Datenbankebene geändert werden?

3voto

Julio Nobre Punkte 4046

Como andyuk hat bereits darauf hingewiesen, dass dies passieren kann, wenn ein NULL einem nicht löschbaren Wert zugewiesen wird DateTime Bereich. Erwägen Sie eine Änderung DateTime a DateTime? o Nullbar < DateTime >. Beachten Sie, dass Sie bei der Verwendung eines Abhängigkeitseigenschaft sollten Sie auch sicherstellen, dass der Typ Ihrer Abhängigkeitseigenschaft ebenfalls ein nullbarer DateTime-Typ ist.

Nachstehend ein Beispiel aus der Praxis für eine unvollständige DateTime a DateTime? Typanpassung, die das merkwürdige Verhalten hervorruft

enter image description here

2voto

Mahmut C Punkte 417

Das Entity Framework 4 arbeitet mit dem Datentyp datetime2, so dass das entsprechende Feld in db für SQL Server 2008 datetime2 sein muss.

Um die Lösung zu erreichen, gibt es zwei Möglichkeiten.

  1. Um den Datentyp datetime in Entity Framwork 4 zu verwenden, müssen Sie den ProviderManifestToken in der edmx-Datei auf "2005" setzen.
  2. Wenn Sie das entsprechende Feld als Null zulassen (es wird in NULLABLE umgewandelt), dann verwendet EF automatisch Datumsobjekte als datetime.

2voto

Ajith Chandran Punkte 21

Fügen Sie das unten genannte Attribut zu der Eigenschaft in Ihrer Modellklasse hinzu.

Attribute = [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Reference = System.ComponentModel.DataAnnotations.Schema

Ursprünglich hatte ich vergessen, dieses Attribut hinzuzufügen. Daher wurde die Einschränkung in meiner Datenbank wie folgt erstellt

ALTER TABLE [dbo].[TableName] ADD DEFAULT (getdate()) FOR [ColumnName]

und ich fügte dieses Attribut hinzu und aktualisierte meine Datenbank, dann wurde es geändert in

ALTER TABLE [dbo].[TableName] ADD CONSTRAINT [DF_dbo.TableName_ColumnName] DEFAULT (getdate()) FOR [ColumnName]

2voto

Mukhtiar Zamin Punkte 39

In meinem Fall, wenn ein NULL-Wert explizit für Nullable DateTime Spalte zugewiesen wird und dann versuchen Sie, die Änderungen zu speichern. Dieser Fehler wird angezeigt.

1voto

dynamiclynk Punkte 2134

Erstellung einer Basisklasse auf der Grundlage der Implementierung von @sky-dev. So kann dies leicht auf mehrere Kontexte und Entitäten angewendet werden.

public abstract class BaseDbContext<TEntity> : DbContext where TEntity : class
{
    public BaseDbContext(string connectionString)
        : base(connectionString)
    {
    }
    public override int SaveChanges()
    {

        UpdateDates();
        return base.SaveChanges();
    }

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries<TEntity>())
        {
            var values = change.CurrentValues;
            foreach (var name in values.PropertyNames)
            {
                var value = values[name];
                if (value is DateTime)
                {
                    var date = (DateTime)value;
                    if (date < SqlDateTime.MinValue.Value)
                    {
                        values[name] = SqlDateTime.MinValue.Value;
                    }
                    else if (date > SqlDateTime.MaxValue.Value)
                    {
                        values[name] = SqlDateTime.MaxValue.Value;
                    }
                }
            }
        }
    }
}

Verwendung:

public class MyContext: BaseDbContext<MyEntities>
{

    /// <summary>
    /// Initializes a new instance of the <see cref="MyContext"/> class.
    /// </summary>
    public MyContext()
        : base("name=MyConnectionString")
    {
    }
    /// <summary>
    /// Initializes a new instance of the <see cref="MyContext"/> class.
    /// </summary>
    /// <param name="connectionString">The connection string.</param>
    public MyContext(string connectionString)
        : base(connectionString)
    {
    }

     //DBcontext class body here (methods, overrides, etc.)
 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X