Kendo UI Scheduler: произошло переполнение при преобразовании в дату и время

Я разрабатываю с использованием .NET MVC и планировщика пользовательского интерфейса Kendo (с открытым исходным кодом). Я пытаюсь сохранить/прочитать/обновить/удалить события из планировщика в свою базу данных с помощью javascript.

Но у меня возникла проблема: при сохранении события из планировщика в мою базу данных я получаю следующую ошибку:

Не удалось загрузить ресурс: сервер ответил со статусом 500 (внутренняя ошибка сервера): System.Data.SqlServerCe.SqlCeException: произошло переполнение при преобразовании в дату и время.

Также при чтении из базы данных в планировщик:

Uncaught TypeError: невозможно вызвать метод getTimezoneOffset со значением null

Я погуглил это, но пока не нашел решения, я следил за документацией: http://docs.telerik.com/kendo-ui/getting-started/using-kendo-with/aspnet-mvc/helpers/scheduler/ajax-editing и, кроме того, прочитайте всю документацию, касающуюся планировщика пользовательского интерфейса Telerik Kendo...

Я использую следующий код:

МОДЕЛЬ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using Kendo.Mvc.UI;

namespace Eindwerk.Models
{
    public class BookingViewModel : ISchedulerEvent
    {
        [Key]
        public int TaskID { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }

        private DateTime start;
        public DateTime Start
        {
            get
            {
                return start;
            }
            set
            {
                start = value.ToUniversalTime();
            }
        }

        private DateTime end;
        public DateTime End
        {
            get
            {
                return end;
            }
            set
            {
                end = value.ToUniversalTime();
            }
        }
        public string RecurrenceRule { get; set; }
        public int? RecurrenceID { get; set; }
        public string RecurrenceException { get; set; }        
        public bool IsAllDay { get; set; }
        public int? OwnerID { get; set; }
        public string eventRoom { get; set; }
        public string eventAttend { get; set; }
        public string eventExtra { get; set; }
        public string eventRequest { get; set; }

        public class CalendarDBContext : DbContext
        {
            public DbSet<BookingViewModel> Bookings { get; set; }
        }

    }
}

КОНТРОЛЛЕР

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Eindwerk.Models;
using Kendo.Mvc.Extensions;
using Kendo.Mvc;
using Kendo.Mvc.UI;
using System.Data.Entity;

namespace Eindwerk.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/
        private Reports.ReportsDBContext rdb = new Reports.ReportsDBContext();

        // GET: /Reports/
        public ActionResult Index()
        {
            return View(rdb.Events.OrderByDescending(p => p.Id).ToList());
            return View();

        }

        private BookingViewModel.CalendarDBContext db = new BookingViewModel.CalendarDBContext();

        public ActionResult Bookings_Read([DataSourceRequest]DataSourceRequest request)
        {

            using (var sampleDB = db)
            {
                IQueryable<BookingViewModel> Bookings = sampleDB.Bookings.ToList().Select(task => new BookingViewModel()
                {
                    TaskID = task.TaskID,
                    Title = task.Title,
                    Start = DateTime.SpecifyKind(task.Start, DateTimeKind.Utc),
                    End = DateTime.SpecifyKind(task.End, DateTimeKind.Utc),
                    Description = task.Description,
                    IsAllDay = task.IsAllDay

                }).AsQueryable();
                return Json(Bookings.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);


            }
        }

        public ActionResult Bookings_Create([DataSourceRequest]DataSourceRequest request, BookingViewModel task)
        {


            if (ModelState.IsValid)
            {
                using (var sampleDB = db)
                {
                    //Create a new Task entity and set its properties from the posted BookingViewModel
                    var entity = new BookingViewModel
                    {
                        TaskID = task.TaskID,
                        Title = task.Title,
                        Start = DateTime.SpecifyKind(task.Start, DateTimeKind.Utc),
                        End = DateTime.SpecifyKind(task.End, DateTimeKind.Utc),
                        Description = task.Description,
                        IsAllDay = task.IsAllDay


                    };


                    // Add the entity
                    sampleDB.Bookings.Add(entity);
                    //sampleDB.Bookings.AddObject(entity);
                    // Insert the entity in the database
                    sampleDB.SaveChanges();

                    // Get the TaskID generated by the database
                    task.TaskID = entity.TaskID;
                }
            }
            // Return the inserted task. The scheduler needs the generated TaskID. Also return any validation errors.
            return Json(new[] { task }.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);


        }

        public ActionResult Bookings_Update([DataSourceRequest]DataSourceRequest request, BookingViewModel task)
        {
            if (ModelState.IsValid)
            {
                using (var sampleDB = db)
                {
                    // Create a new Task entity and set its properties from the posted TaskViewModel
                    var entity = new BookingViewModel
                    {
                        TaskID = task.TaskID,
                        Title = task.Title,
                        Start = task.Start,
                        End = task.End,
                        Description = task.Description,
                        RecurrenceRule = task.RecurrenceRule,
                        RecurrenceException = task.RecurrenceException,
                        RecurrenceID = task.RecurrenceID,
                        IsAllDay = task.IsAllDay,
                        OwnerID = task.OwnerID
                    };
                    // Attach the entity
                    sampleDB.Bookings.Attach(entity);
                    // Change its state to Modified so Entity Framework can update the existing task instead of creating a new one
                    //sampleDB.Entry(entity).State = EntityState.Modified;
                    // Or use ObjectStateManager if using a previous version of Entity Framework
                    sampleDB.Entry(entity).State = EntityState.Modified;
                    // Update the entity in the database
                    sampleDB.SaveChanges();
                }
            }
            // Return the updated task. Also return any validation errors.
            return Json(new[] { task }.ToDataSourceResult(request, ModelState));
        }

        public ActionResult Tasks_Destroy([DataSourceRequest]DataSourceRequest request, BookingViewModel task)
        {
            if (ModelState.IsValid)
            {
                using (var sampleDB = db)
                {
                    // Create a new Task entity and set its properties from the posted TaskViewModel
                    var entity = new BookingViewModel
                    {
                        TaskID = task.TaskID,
                        Title = task.Title,
                        Start = task.Start,
                        End = task.End,
                        Description = task.Description,
                        RecurrenceRule = task.RecurrenceRule,
                        RecurrenceException = task.RecurrenceException,
                        RecurrenceID = task.RecurrenceID,
                        IsAllDay = task.IsAllDay,
                        OwnerID = task.OwnerID
                    };
                    // Attach the entity
                    sampleDB.Bookings.Attach(entity);
                    // Delete the entity
                    //sampleDB.Tasks.Remove(entity);
                    // Or use DeleteObject if using a previous versoin of Entity Framework
                    sampleDB.Bookings.Remove(entity);
                    // Delete the entity in the database
                    sampleDB.SaveChanges();
                }
            }
            // Return the removed task. Also return any validation errors.
            return Json(new[] { task }.ToDataSourceResult(request, ModelState));
        }
    }
}

ПОСМОТРЕТЬ

<!DOCTYPE html>
<html>    
<head>  
    <script>
          $(function () {
            $('#scheduler').kendoScheduler({
                date: new Date(Date.now()),
                startTime: (new Date(2014, 6, 13, 7, 00, 00)),
                height:800,
                views: [{ type: "day", selected: true }, { type: 'week' }, { type: 'month' }],
                timezone: "Etc/UTC",
                dataSource:
                    {
                        transport:
                        {
                            read: { url: "@Url.Action("Bookings_Read","Home")", dataType: "json" },
                            update: { url: "@Url.Action("Bookings_Update","Home")", dataType: "json" },
                            create: { url: "@Url.Action("Bookings_Create","Home")", dataType: "json" },
                            destroy: { url: "@Url.Action("Bookings_Destroy","Home")", dataType: "json" },
                                parameterMap: function (options, operation) {
                                    if (operation !== "read" && options.models) {
                                        return { models: kendo.stringify(options.models) };
                                    }  
                                }
                        },

                    },
                schema: {

                    model: { 
                        id: "TaskID", 
                        fields: { 
                            TaskID: { type: "int" }, 
                            RecurrenceID: {type:"int?"}

                        } 
                    } 
                },
            group: {
                resources: ["Rooms"]
            },
            resources: [
                 {
                    field: "attendees",
                    name: "Attendees",
                    dataSource: [
                        { text: "IMD", value: 1, color: "#f8a398" },
                        { text: "IMS", value: 2, color: "#51a0ed" },
                        { text: "Toerisme", value: 3, color: "#56ca85" }
                    ],
                    multiple: true,
                    title: "Attendees"
                },

                {
                    field: "roomId",
                    name: "Rooms",
                    dataSource: {
                        transport:
                            {
                                read: { url: "@Url.Action("Rooms_Read","Room")", dataType: "json" }
                            }    
                    }
                }
            ]              
          });
        });
     </script>
</head>
<body>

Кто-нибудь знает, как решить эту ошибку? Или рабочий иллюстративный пример?

Ваша помощь очень ценится!


База данных:

дизайн базы данных

данные добавляются в БД, но не могут отображаться в планировщике

введите здесь описание изображения


person user3629755    schedule 16.05.2014    source источник


Ответы (2)


Ваша модель выглядит нормально в C#, но какие типы SQL являются вашими полями Start и End в вашей базе данных, потому что ошибка происходит между SQLServerCE и моделью представления C#, в которой она появляется. Из этого блога, структура базы данных (хотя и SQL Server 2012) показана так:

введите здесь описание изображения

person piercove    schedule 22.05.2014
comment
Спасибо за Ваш ответ! Теперь я обновил свою базу данных, чтобы она соответствовала вашему примеру (типы действительно были datetime вместо datetime2). Но возникает эта ошибка Uncaught TypeError: не удается вызвать метод getTimezoneOffset с нулевым значением. Когда я добавляю запись, она добавляется в мою базу данных, но я не могу отобразить ее в планировщике, я добавлю примеры к моему вопросу выше . - person user3629755; 23.05.2014
comment
Небольшое замечание: в моих собраниях БД тип установлен на datetime2 (7), но мой edmx все еще использует DateTime? И я не могу изменить эту причину, потому что datetime2 отсутствует в списке типов в моем edmx... Это вызывает проблему? Так запутанно... - person user3629755; 23.05.2014
comment
DateTime2 должен быть найден, и если он преобразуется в DateTime?, это просто означает, что столбец базы данных допускает значения NULL. - person piercove; 24.05.2014
comment
Таким образом, для событий Kendo Scheduler Start и [End] всегда должны иметь значение, поскольку оно использует их для определения блока событий (UI) при рендеринге расписания. Ваше ДатаВремя? на самом деле должно быть DateTime (не допускает нулевых значений). - person piercove; 24.05.2014
comment
Мой комментарий был немного запутанным, я имел в виду: в моих собраниях БД тип установлен на datetime2 (7), но мой edmx все еще использует DateTime. Знак вопроса был просто знаком вопроса, я не имел в виду DateTime? - person user3629755; 24.05.2014

Удалите строку:

timezone: "Etc/UTC"; 

эта строчка похоже на винт планировщика.

person Quetzalcoatl V.    schedule 02.04.2015