Nullable <DateTime>в сущности вызывает проблемы в моем выражении linq - PullRequest
0 голосов
/ 05 марта 2019

Вот InnerException из этого метода:

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

Ниже приведен метод, где генерируется это исключение.Я полагаю, что это как-то связано с тем, что столбцы Created_Date и Modified_Date являются datetime?

. Я попытался сделать это несколькими способами, как вы можете убедиться по коду, приведенному ниже ролью.однако проблема не возникает там.

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();
            }
        }

РЕДАКТИРОВАТЬ (РЕШЕНО):

Спасибо за вклад всех, вот шаги, которые я использовал для решения проблемы на основе комментариев и ответов.

МОДЕЛЬ РОЛЯ (Обновлено для поддержки Nullable):

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);
    }

Метод GetRoles:

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();
            }
        }

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

на сервере sql у вас есть (как минимум) два DateTime типа:

  • дата-время: 1753/01/01 до конца времени
  • дата-время2: 0001/01/ 01 до конца времени

Каждый из этого типа может быть привязан к .Net DateTime, но DateTime.MinValue всегда 0001/01/01.Поэтому, если столбец sql настроен как дата и время, сервер sql выдает аргумент, когда вы пытаетесь написать DateTime.MinValue.

. Таким образом, вы можете:

  • изменить свою модель на уровне базы данных.использовать datetime2 или
  • изменить код для неиспользования DateTime.MinValue

. Существуют также другие соображения, такие как DateTime2 против DateTime в SQL Server

1 голос
/ 05 марта 2019

Не пропустите DateTime.MinValue. Это 1 января 0001 года, что меньше минимального значения для SQL Server datetime (01.01.1753). Если вы не работаете с историческими данными, которые уходят так далеко, вы можете просто создать свою собственную константу для значение, как 1/1/1753 и использовать это.

DateTime.MaxValue нормально, потому что для типа .NET и SQL-сервера это 12/31 / 9999.

Чаще всего мы просто используем datetime2 в качестве нашего типа в SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...