kap*_*ade 3 c# asp.net entity-framework
如何在c#中将datetime转换为smalldatetime?我正在接受日期和ı需要将其转换为符合数据库.禁止在sql中更改列的数据类型.
您可以将.NET DateTime类型用于实体框架模型,但告诉EF它在数据库中使用非默认列类型.您可以通过重写DbContext的OnModelCreating方法并使用HasColumnType方法来完成此操作:
public class Foo
{
public int Id { get; set; }
public DateTime IAmSoSmall { get; set; } // wants to be smalldatetime in SQL
}
public class MyContext : DbContext
{
public DbSet<Foo> Foos { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var foo = modelBuilder.Entity<Foo>();
foo.Property(f => f.IAmSoSmall).HasColumnType("smalldatetime");
base.OnModelCreating(modelBuilder);
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您必须对DateTime属性进行适当的范围检查,以确保存储的值介于SQL的smalldatetime支持的值之间.我想你可以使用属性属性来做到这一点:
[Range(typeof(DateTime), "1/1/1900", "6/6/2079")]
public DateTime IAmSoSmall { get; set; } // wants to be smalldatetime in SQL
Run Code Online (Sandbox Code Playgroud)
...基于MSDN上记录的1900年1月1日至2079年6月6日的有效范围.
Sql Server datetime和smalldatetime它们都自动映射到CLR和从CLR映射System.DateTime.A smalldatetime精度为1分钟; a datetime的精度约为1/300秒(不要问为什么.它只是).由于CLR的System.DateTime1精度为100纳秒,因此运行时会处理舍入.
smalldatetime内部是一个32位整数,包含自smalldatetime纪元(1900-01-01 00:00)以来的分钟数.
在转换中,使用SQL Server的晦涩日期/时间舍入规则舍入秒和小数秒,因此日期2013-01-31 23:59:59将四舍五入到下一个日期2013-02-01 00:00:00 '.
datetime是内部的一对32位整数.高阶词是自纪元以来的天数; 低位字是自开始日(00:00:00)以来的毫秒数.a的时代datetime是1900-01-01 00:00:00.000.
同样,转换中的值以相同的神秘方式进行四舍五入,将法定秒数放入SQL Server的适当毫秒桶之一,3ms的倍数 - 没有像2013-05-01那样的SQL Server`datetime值13:57:23.004.这将"四舍五入"到23.003ms或23.006ms.
如果您想要更多地控制事物,则需要在将它们发送到数据库之前在C#中调整日期时间值.