.net 如何使用实体框架6将'time(0)`映射到'DateTime'

.net 如何使用实体框架6将'time(0)`映射到'DateTime',.net,sql,entity-framework,datetime,.net,Sql,Entity Framework,Datetime,是否有任何方法可以使用EntityFramework6的新依赖模式注入自定义映射规则 我正在使用的数据库在几列time(0)中存储了一天中的时间 ,时间数据类型定义了特定的“一天中的时间”,而不是任意的时间长度。这可以通过时间类型00:00:00.0000000到23:59:59.999999的范围来证明 这里一切都好。但是,实体框架拒绝将其映射到DateTime属性 到ADO.NET默认值TimeSpan的映射远非理想(as),因为SQL Server的time不是任意的时间跨度,而是AM/P

是否有任何方法可以使用EntityFramework6的新依赖模式注入自定义映射规则

我正在使用的数据库在几列
time(0)
中存储了一天中的时间

,时间数据类型定义了特定的“一天中的时间”,而不是任意的时间长度。这可以通过
时间
类型00:00:00.0000000到23:59:59.999999的范围来证明

这里一切都好。但是,实体框架拒绝将其映射到
DateTime
属性

到ADO.NET默认值
TimeSpan
的映射远非理想(as),因为SQL Server的
time
不是任意的时间跨度,而是AM/PM上下文。NET的时间跨度格式化程序没有AM/PM的概念<代码>时间
时间跨度
用于单独的问题域。从纯粹理想主义的角度来看,我宁愿总是将
时间
映射到
日期时间
。这也是有道理的,因为一天中有固定的起点

更糟糕的是,由于
time
TimeSpan
这两个独立的问题域,像DevExpress的TimeEdit这样的控件将只绑定到
DateTime
属性。我希望避免用重复的属性弄脏我的所有实体,这些属性只是在
TimeSpan
DateTime
之间转换

(作者在这里提出了同样的问题,但要求较少:
)

您的问题看起来很像此页面上用于更改日期时间约定的示例:

也许是这样的:

public class TimeSpanConvention : Convention
{
    public TimeSpanConvention()
    {
        this.Properties<TimeSpan>()
            .Configure(c => c.HasColumnType("datetime"));        
    }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Add(new TimeSpanConvention());
}
在上下文类中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{      modelBuilder.Types().Configure(c =>
   {
      var properties = c.ClrType.GetProperties(BindingFlags.NonPublic 
                                         | BindingFlags.Instance)
                             .Where(p => p.Name == "DBTimeOfDay");
       foreach (var p in properties)
           c.Property(p).HasColumnName("TimeOfDay");
   });
}
另一个选项是创建一个数据库视图,该视图在其sql中将
time(0)
转换为
DateTime
,并映射到修改后的存储过程进行更新。这项技术已被建议用于

编辑3 在这件事上睡了一觉……以下是我的想法

时间(0)表示一天中的某个时间

实体框架已选择将其转换为
Timespan

Timespan
s应表示持续时间

timespan
很容易添加到
DateTime
s,结果是一个新的
DateTime

C#没有
TimeOfDay
数据类型

因此,在您的业务逻辑中,您必须将“一天中的时间”设置为从不超过24小时的
TimeSpan
,或者设置为
DateTime
,将日期部分设置为任意值,然后忽略

EF与C一致,其中
DateTime.TimeOfDay
返回时间跨度

如果你在做商业逻辑中的算术运算,比如说定期约会之类的,那么我认为实际上可能有一个更有力的理由支持时间跨度。如果它很复杂,那么也许你应该开始使用

当它移动到UI时,问题就出现了
TimeEdit
需要一个
DateTime
…我们希望将其显示为a.m./p.m


这就是我将它映射到日期时间的地方,即在UI中。我正在使用MVC。我使用的是ViewModels。我已经在从实体映射。我用的是AutoMapper。这很简单,而且可以保持实体的干净
TimeSpan
域中的属性转换为UI的
DateTime

我可能会弄脏数据库、实体或程序逻辑,但我希望有一种方法可以首先解决这个问题。如果流畅的映射起作用,也不会出现单独映射属性的问题。但是,出现运行时错误,表示错误2019:指定的成员映射无效。类型“Edm.DateTime[Nullable=True,DefaultValue=,Precision=]”与“SqlServer.time[Nullable=True,DefaultValue=,Precision=7]不兼容“
DateTime
在数据库中,或者复制属性,以便在
TimeSpan
DateTime
之间进行转换……那么,有谁能够解释通过依赖关系修改EF的行为呢?
private string DBTimeOfDay { get; set; }

[System.ComponentModel.DataAnnotations.Schema.NotMapped]
public DateTime TimeOfDay
{
    get { return new DateTime(DBTimeOfDay.Ticks); }
    set { DBTimeOfDay= value.TimeOfDay; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{      modelBuilder.Types().Configure(c =>
   {
      var properties = c.ClrType.GetProperties(BindingFlags.NonPublic 
                                         | BindingFlags.Instance)
                             .Where(p => p.Name == "DBTimeOfDay");
       foreach (var p in properties)
           c.Property(p).HasColumnName("TimeOfDay");
   });
}