.net 如何使用实体框架6将'time(0)`映射到'DateTime'
是否有任何方法可以使用EntityFramework6的新依赖模式注入自定义映射规则 我正在使用的数据库在几列.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
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");
});
}