也许这是一个旧线程,但我会将我的发现发布给其他人:
假设我们有开发环境:EF 5、CodeFirst、SqlCE 4.0:
public abstract class Entity : IEntity, IEquatable<Entity>
{
public virtual int Id { get; protected set; }
public virtual DateTime LastModified { get; set; }
[DataType(DataType.Date)]
public virtual DateTime CreatedOn { get; set; }
[DataType(DataType.DateTime)]
public virtual DateTime CreatedOn2 { get; set; }
[DataType(DataType.Time)]
public virtual DateTime CreatedOn3 { get; set; }
public virtual DateTime CreatedOn4 { get; set; }
}
使用这样的自定义映射:
public EntityMapping()
{
HasKey(e => e.Id);
Property(e => e.Id);
Property(e => e.LastModified).IsRequired().IsConcurrencyToken();
Property(e => e.CreatedOn).IsRequired();
Property(e => e.CreatedOn2).IsRequired();
Property(e => e.CreatedOn3).IsRequired();
Property(e => e.CreatedOn4).IsRequired();
}
这会产生this,这意味着我们会有溢出异常。
在仍然使用 SQL CE 4.0 的同时将映射更改为此:
Property(e => e.CreatedOn).IsRequired().HasColumnType("datetime2");
Property(e => e.CreatedOn2).IsRequired().HasColumnType("date");
Property(e => e.CreatedOn3).IsRequired().HasColumnType("date");
Property(e => e.CreatedOn4).IsRequired().HasColumnType("datetime2");
给这个error。
切换到 SQL Server Standart 2012 似乎可以解决问题(这肯定不是解决方案 - 仅用于实验)。创建的 SQL Server 架构是 this。
我不是 Sql 专家,但在我看来 SQL CE does not support these dates。开发环境的问题。遗迹。 DateTime 可以被替换,但可以在这里和这里带来很多重构。
还要记住SqlDateTime and DateTime are very different。
我认为对代码和项目生命周期有益的解决方案是在 LocalDb 和 SQL 标准之间切换,如上面来自 stackoverflow 的链接之一的建议,结合自定义 fluentApi 映射设置以均衡模型创建或两者兼而有之。
引入custom convention in EF 作为安全网看起来也不错。
如果有人对代码和开发生产都有更好的全方位解决方案,请发布。