如何使用Lambda表达式访问正确的数据类型?Entity Framework中Time(7)与DateTime类型适配问题求解
解决EF中SQL Server Time(7)与.NET类型的映射问题
看起来你遇到的核心问题是SQL Server的Time(7)类型和.NET类型不匹配导致的赋值错误,咱们一步步来解决:
1. 先修正EF实体类的字段类型
SQL Server的Time(7)对应的.NET原生类型是TimeSpan,而非DateTime。所以首先得调整你的Incident_Template实体类(就是EF映射数据库表的那个模型),把Time字段的类型从DateTime改成TimeSpan:
// 修正后的Incident_Template实体类示例 public class Incident_Template { // 其他字段保持不变... public TimeSpan Time { get; set; } // 替换原来的DateTime类型 }
如果是Database First生成的模型,你可以重新从数据库更新模型,确保选择TimeSpan作为该字段的类型;如果是Code First,需要明确映射到Time(7):
- 用DataAnnotation的方式:
[Column(TypeName = "time(7)")] public TimeSpan Time { get; set; } - 用Fluent API的方式(在DbContext的
OnModelCreating方法里配置):modelBuilder.Entity<Incident_Template>() .Property(t => t.Time) .HasColumnType("time(7)");
2. 处理Incident_DropDown模型的赋值
接下来看你的Incident_DropDown模型,里面的Time字段是DateTime类型,这里有两种合理的处理方式:
方式一:把Incident_DropDown的Time改成TimeSpan(推荐)
如果你的业务只需要时间部分(不需要关联日期),直接把模型类型改成TimeSpan,赋值就完全没问题了:
public class Incident_DropDown { // 其他字段保持不变... public TimeSpan Time { get; set; } // 替换原来的DateTime类型 } // 赋值时直接赋值即可 model.Time = cData.Time;
方式二:将TimeSpan转换为DateTime(如果业务必须用DateTime)
如果确实需要DateTime类型,你可以把TimeSpan和一个基准日期(比如当天)组合成完整的DateTime:
// 用当天日期加上读取到的时间部分 model.Time = DateTime.Today.Add(cData.Time); // 要是需要特定日期,也可以自己指定,比如: // model.Time = new DateTime(2024, 1, 1).Add(cData.Time);
3. 解决"数据类型对象被设置为字符串"的报错
这个报错本质是EF实体类的Time字段类型和数据库Time(7)不匹配,导致EF读取数据时无法正确转换,误把数据当成字符串处理。按照第一步修正实体类类型后,这个问题应该就会消失。
另外,你的代码还可以简化优化一下,不用先ToList再循环,直接在LINQ里投影会更高效:
public List<Incident_DropDown> GetIncident_Details() { using (Entities incident = new Entities()) { // 用using自动释放上下文资源 return incident.Incident_Template .Select(c => new Incident_DropDown { Title = c.Title, Description = c.Description, Date_Occurred = c.Date_Occurred, Time = DateTime.Today.Add(c.Time), // 或者直接赋值TimeSpan,看你选的方式 Assignment_Group = c.Assignment_Group, Reported_CI = c.Reported_CI }) .ToList(); } }
内容的提问来源于stack exchange,提问作者Gcobani Mkontwana
相关产品推荐
相关产品推荐

