实体中的 Nullable<DateTime> 导致我的 linq 表达式出现问题

Nullable<DateTime> in entity causes issues in my linq expression

这是此方法的 InnerException:

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

下面是产生这个异常的方法。我相信这与 Created_DateModified_Datedatetime?

有关

我已经尝试过多种方式来执行此操作,您可以通过下面的代码看出 role.Is_Active 也是一个可为空的列,但是没有遇到任何问题。

public IEnumerable<Models.DTO.Role> GetRoles(bool active = true, int limit = 10)
        {
            using (var context = new SmartWarehouseEntities())
            {
                var roles = context.Security_Role
                                    .Where(role => role.Is_Active == active)
                                    .Select(role => new Models.DTO.Role
                                    {
                                        SecurityRoleId = role.Security_Role_Id,
                                        RoleName = role.Role_Name,
                                        RoleDetail = role.Role_Detail,
                                        IsActive = role.Is_Active ?? false,
                                        Created = role.Created_Date.HasValue ? role.Created_Date.Value :  DateTime.MinValue,
                                        Modified = role.Modified_Date.HasValue ? role.Created_Date.Value : DateTime.MinValue
                                    })
                                    .Take(limit);
                return roles.ToArray();
            }
        }

编辑(已解决):

感谢大家的意见,以下是我根据评论和回答解决问题的步骤。

角色模型(更新为接受可空):

public class Role
    {
        public int SecurityRoleId { get; set; }

        public string RoleName { get; set; }

        public string RoleDetail { get; set; }

        public bool IsActive { get; set; }

        public DateTime? Created { get; set; }

        public string CreatedDate => !Created.HasValue
            ? string.Empty
            : Created.Value.ToString(CultureInfo.InvariantCulture);

        public DateTime? Modified { get; set; }

        public string ModifiedDate => !Modified.HasValue
            ? string.Empty
            : Modified.Value.ToString(CultureInfo.InvariantCulture);
    }

获取角色方法:

public IEnumerable<Models.DTO.Role> GetRoles(bool active = true, int limit = 10)
        {
            using (var context = new SmartWarehouseEntities())
            {
                var roles = context.Security_Role
                                    .Where(role => role.Is_Active == active)
                                    .Select(role => new Models.DTO.Role
                                    {
                                        SecurityRoleId = role.Security_Role_Id,
                                        RoleName = role.Role_Name,
                                        RoleDetail = role.Role_Detail,
                                        IsActive = role.Is_Active ?? false,
                                        Created = role.Created_Date,
                                        Modified = role.Modified_Date
                                    })
                                    .Take(limit);
                return roles.ToArray();
            }
        }

不及格DateTime.MinValue。现在是 0001 年 1 月 1 日,它小于 SQL 服务器 datetime (1/1/1753) 的最小值。除非您正在处理可以追溯到那么远的历史数据,否则您可以为 1/1/1753 这样的值创建自己的常量并使用它。

DateTime.MaxValue 没问题,因为对于 .NET 类型和 SQL 服务器,它都是 12/31/9999。

更多时候我们只是使用 datetime2 作为我们在 SQL 服务器中的类型。

在 sql 服务器中你有(至少)两个 DateTime 类型:

  • 日期时间:1753/01/01 到时间结束
  • datetime2: 0001/01/01 到时间结束

每个这种类型都可以绑定到 .Net DateTime,但 DateTime.MinValue 始终是 0001/01/01。因此,将 sql 列配置为日期时间后,sql 服务器会在您尝试编写 DateTime.MinValue.

时争辩

所以你可以:

  • 在数据库级别更改您的模型以使用 datetime2,或者
  • 更改您的代码以不使用 DateTime.MinValue

还有其他的考虑比如DateTime2 vs DateTime in SQL Server