您的问题看起来非常类似于此页面上用于更改 DateTimes 约定的示例:Custom Code First Conventions (EF6 onwards)
可能是这样的:
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());
}
编辑只需重新阅读您的问题,我发现您希望在 C# 代码中使用 DateTime 并在数据库中使用 time(0) 而不是相反,这样就行不通了。不幸的是,我怀疑您将需要 2 个字段,例如此解决方案在映射时转换值- 这确实使数据库属性保持私有。
自定义编码约定的原始想法如何,但基于命名约定:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<DateTime>()
.Where(p => p.Name.EndsWith("TimeOfDay"))
.Configure(p => p.HasColumnType("time(0)"));
}
编辑 2
因为这是一个无效的映射,所以我们别无选择:
在模型中:
private string DBTimeOfDay { get; set; }
[System.ComponentModel.DataAnnotations.Schema.NotMapped]
public DateTime TimeOfDay
{
get { return new DateTime(DBTimeOfDay.Ticks); }
set { DBTimeOfDay= value.TimeOfDay; }
}
在 Context 类中:
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!
睡过这个......这是我的想法。
time(0) 表示一天中的某个时间。
Entity Framework 已选择将其转换为Timespan
.
Timespan
s 应该代表持续时间。
Timespans
很容易添加到DateTime
s 中,结果是一个新的DateTime
C# 没有TimeOfDay
数据类型
因此,在您的业务逻辑中,您必须将一天中的时间保持为TimeSpan
永远不会超过 24 小时的时间,或者作为DateTime
您将日期部分设置为任意值的位置,然后您将忽略该值。
EF 与 C# 一致,其中DateTime.TimeOfDay
返回时间跨度
如果您在业务逻辑中进行任何算术运算,例如定期约会等,那么我认为 TimeSpan 实际上可能有一个稍强的论据。如果它很复杂,那么也许你应该开始使用野田时间
当它移动到 UI 时,问题就来了。TimeEdit
需要一个DateTime
......我们想将它显示为上午/下午......
这就是我将它映射到DateTime 的地方,即在UI 中。我正在使用 MVC。我正在使用视图模型。我已经从实体映射。我正在使用 AutoMapper。这很容易,并且可以保持实体的清洁。TimeSpan
域中的属性转换DateTime
为 UI ..