Pourquoi ne EF5 code de la première utilisation datetime2 lors de l'insertion d'un nullable datetime dans la base de données?

Je suis de l'enregistrement d'un Panier d'objet de la base de données qui a un nullable datetime. C'est l'erreur que je reçois:

La conversion d'un datetime2 type de données à un type de données datetime
entraîné dans une gamme de valeur.

Il existe assez peu de stackoverflow postes de documenter les correctifs à ce problème. Toutefois, lorsque le premier code est la création de la base de données qu'il va créer le champ DateTime (autoriser les valeurs null). Mais pour une raison quelconque, le premier code tente d'insérer à l'aide d'un DateTime2 champ.

Je me demande pourquoi EF crée le champ, mais insère à l'aide d'un type différent pour le même domaine.

C'est l'objet de domaine:

using System;
using System.Collections.Generic;

namespace Core.Domain.Cart
{
    public partial class Cart : BaseEntity, ILocalizedEntity
    {
        private ICollection<Catalog> _catalogs;

        ///<summary>
        ///Gets or sets the name
        ///</summary>
        public virtual string Name { get; set; }

        ///<summary>
        ///Gets or sets the zone identifier
        ///</summary>
        public virtual int ZoneId { get; set; }

        ///<summary>
        ///Gets or sets the brand identifier
        ///</summary>
        public virtual int BrandId { get; set; }

        ///<summary>
        ///Gets or sets the customer type identifier
        ///</summary>
        public virtual int CustomerTypeId { get; set; }

        ///<summary>
        ///Gets or sets the date and time of the opening of a cart
        ///</summary>
        public virtual DateTime? OpeningDateUtc { get; set; }

        ///<summary>
        ///Gets or sets the date and time of the closing of a cart
        ///</summary>
        public virtual DateTime? ClosingDateUtc { get; set; }

        ///<summary>
        ///Gets or sets a value indicating whether the entity is online or not
        ///</summary>
        public virtual bool IsOnline { get; set; }

        /* Truncated for relevance */
    }    
}

Le modèle:

using FluentValidation.Attributes;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using Telerik.Web.Mvc;
namespace Admin.Models.Cart
{
[Validator(typeof(CartValidator))]
public partial class CartModel : BaseNopEntityModel, ILocalizedModel<CartLocalizedModel>
{            
public CartModel()
{
Locales = new List<CartLocalizedModel>();
Catalogs = new List<CatalogModel>();
UnassociatedCatalogs = new List<CatalogModel>();
}
[NopResourceDisplayName("Admin.Carts.Fields.Name")]
[AllowHtml]
public string Name { get; set; }
//Zone dropdown
[NopResourceDisplayName("Admin.Carts.Fields.ZoneList")]
public SelectList ZoneList { get; set; }        //The dropdown with zones
public int ZoneId { get; set; }                 //The selected value of the dropdown once the form is submitted
public string ZoneName { get; set; }            //The name of the zone to display in data-grid List view.
//Brand dropdown
[NopResourceDisplayName("Admin.Carts.Fields.BrandList")]
public SelectList BrandList { get; set; }       //The dropdown with brands
public int BrandId { get; set; }                //The selected value of the dropdown once the form is submitted
public string BrandName { get; set; }           //The name of the brand to display in the data-grid List view. 
//Customer type dropdown
[NopResourceDisplayName("Admin.Carts.Fields.CustomerTypeList")]
public SelectList CustomerTypeList { get; set; }//The dropdown with CustomerType
public int CustomerTypeId { get; set; }         //The selected value of the dropdown once the form is submitted
public string CustomerTypeName { get; set; }    //The name of the CustomerType to display in the data-grid List view. 
[NopResourceDisplayName("Admin.Carts.Fields.OpeningDateUtc")]
[UIHint("DateNullable")]
public DateTime? OpeningDateUtc { get; set; }
[NopResourceDisplayName("Admin.Carts.Fields.ClosingDateUtc")]
[UIHint("DateNullable")]
public DateTime? ClosingDateUtc { get; set; }
[NopResourceDisplayName("Admin.Carts.Fields.IsOnline")]
public bool IsOnline { get; set; }
/* Truncated for relevance */
}
}

Donc à la fois la OpeningDateUtc et la ClosingDateUtc sont de type DateTime?.

C'est la façon dont la base de données est généré par EF premier code:
Pourquoi ne EF5 code de la première utilisation datetime2 lors de l'insertion d'un nullable datetime dans la base de données?

La OpeningDateUtc et ClosingDateUtc sont créés en tant que nullable champ DateTime.

Alors pourquoi est-il lorsque j'enregistre à l'aide de la IDBContext.SaveChanges(), le SQL généré pour la requête:

exec sp_executesql N'update [dbo].[Cart]
set [Name] = @0, [ZoneId] = @1, [BrandId] = @2, [CustomerTypeId] = @3, [OpeningDateUtc] = @4, [ClosingDateUtc] = @5, [IsOnline] = @6, [IsReadonly] = @7, [IsPreviewMode] = @8, [CreatedOnUtc] = @9
where ([Id] = @10)
',N'@0 nvarchar(100),@1 int,@2 int,@3 int,@4 datetime2(7),@5 datetime2(7),@6 bit,@7 bit,@8 bit,@9 datetime2(7),@10 int',@0=N'Cart1',@1=7,@2=4,@3=5,@4='2013-01-09 00:00:00',@5='2013-01-18 00:00:00',@6=0,@7=0,@8=1,@9='0001-01-01 00:00:00',@10=1

La partie la plus intéressante étant @4 datetime2(7),@5 datetime2(7).

Je comprends que j'ai pu résoudre ce problème en ajoutant un .HasColumnType("datetime2") au panier carte, mais il n'a pas répondu pourquoi EF5 (et probablement les versions plus anciennes) configurer pour accepter les valeurs null datetime.

OriginalL'auteur Matt R | 2013-01-09