Hope someone has the patients to spell out for me the actual changes needed in the DBSchedulerProviderBase(inherited from SchedulerProviderBase) class to work with my Entities Provider. I cant seem to find any examples of what needs to change in this base class to get my Entities associated with my custom RadLabDBSchedulerProvider class.
Here is what i have so far in this Base Class - I have added the obvious DBFactory and ConnectionString, :
So what needs to go in PersitChanges, Initialize(), DbConnection, etc??... I have my inherited class for the provider all ready, just i don't understand all these function in the base class, and what needs be changed. Can you point me to examples? Ok with giving me links to other resources, but if you could spell out an examples (cant seem to find any examples of this in your codebase or docs).
Here is my web.config info:
And if needed, here is my RadLabDbSchedulerProvider.cs code - This is what i would then assign to radscheduler1.Provider = RadLabDbSchedulerProvider:
Here is what i have so far in this Base Class - I have added the obvious DBFactory and ConnectionString, :
public abstract class DbSchedulerProviderBase : SchedulerProviderBase { protected DbProviderFactory DbFactory { get { return DbProviderFactories.GetFactory("System.Data.EntityClient");} set { }} protected bool PersistChanges { get { }; set { }; } protected string ConnectionString { get { return ConfigurationManager.ConnectionStrings["RadLabDBEntities"].ConnectionString;} set { }; } public override void Initialize(string name, NameValueCollection config) { }; protected virtual DbConnection OpenConnection() { }; protected virtual DbParameter CreateParameter(string name, object value) { }; }So what needs to go in PersitChanges, Initialize(), DbConnection, etc??... I have my inherited class for the provider all ready, just i don't understand all these function in the base class, and what needs be changed. Can you point me to examples? Ok with giving me links to other resources, but if you could spell out an examples (cant seem to find any examples of this in your codebase or docs).
Here is my web.config info:
<configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections> <connectionStrings> <add name="TelerikConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Telerik.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" /> <add name="TelerikVSXConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\TelerikVSX.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" /> <add name="Telerik" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Telerik;Integrated Security=True" providerName="System.Data.SqlClient" /> <add name="RadLabDBEntities" connectionString="metadata=res://BarLab/BarLabModel.csdl|res://BarLab/BarLabModel.ssdl|res://BarLab/BarLabModel.msl;provider=System.Data.SqlClient;provider connection string='data source=IRIONVO\SQLIRIONVO;initial catalog=RadLabDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework'" providerName="System.Data.EntityClient" /> </connectionStrings><entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>And if needed, here is my RadLabDbSchedulerProvider.cs code - This is what i would then assign to radscheduler1.Provider = RadLabDbSchedulerProvider:
using System;using System.Collections;using System.Collections.Generic;using System.Collections.Specialized;using System.Data.Common;using System.Data.SqlClient;using System.Linq;using System.Web;using Telerik.Web.UI; public class RadLabDbSchedulerProvider : DbSchedulerProviderBase { public ArrayList resourceKeys = new ArrayList(); public Dictionary<int, Resource> _persons { get; set; } public Dictionary<int, Resource> _hardware { get; set; } public override IEnumerable<ResourceType> GetResourceTypes(RadScheduler owner) { ResourceType[] resourceTypes = new ResourceType[2]; resourceKeys.Clear(); resourceTypes[0] = new ResourceType("Person", true); resourceKeys.Add("Person"); resourceTypes[1] = new ResourceType("BAR_HW", true); resourceKeys.Add("BAR_HW"); return resourceTypes; } public override IEnumerable<Resource> GetResourcesByType(RadScheduler owner, string resourceType) { switch (resourceType) { case "Person": return Persons.Values; case "BAR_HW": return BAR_HWs.Values; default: throw new InvalidOperationException("Unknown resource type: " + resourceType); } } private IDictionary<int, Resource> Persons { get { if (_persons == null) { _persons = new Dictionary<int, Resource>(); foreach (Resource person in LoadPersons()) { _persons.Add((int)person.Key, person); } } return _persons; } } private IDictionary<int, Resource> BAR_HWs { get { _hardware = new Dictionary<int, Resource>(); foreach (Resource hardware in LoadHardware()) { _hardware.Add((int)hardware.Key, hardware); } return _hardware; } } private IEnumerable<Resource> LoadPersons() { List<Resource> resources = new List<Resource>(); using (DbConnection conn = OpenConnection()) { DbCommand cmd = DbFactory.CreateCommand(); cmd.Connection = conn; cmd.CommandText = "SELECT [ResourceId], [Name], [Type], [Available], [ParentId], [Level], [Status], [Shared], [LastModifedTime], [Url], [LastModifedUser], [Building], [PersonId], [QuicklookId], [Cube], [Phone], [Email] FROM [Person]"; using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Resource res = new Resource(); res.Type = "Person"; res.Key = reader["ResourceId"]; res.Text = Convert.ToString(reader["Name"]); res.Attributes["ParentId"] = Convert.ToString(reader["ParentId"]); res.Attributes["Type"] = Convert.ToString(reader["Type"]); res.Attributes["BomId"] = string.Empty; res.Attributes["Approved"] = string.Empty; resources.Add(res); } } } return resources; } private IEnumerable<Resource> LoadHardware() { List<Resource> resources = new List<Resource>(); using (DbConnection conn = OpenConnection()) { DbCommand cmd = DbFactory.CreateCommand(); cmd.Connection = conn; cmd.CommandText = "SELECT [ResourceId], [Name], [Type], [Available], [ParentId], [Level], [Status], [Shared], [LastModifedTime], [Url], [LastModifedUser], [Building], [HWId], [Lab], [Tile], [BomId], [Owner], [RegisteredTime], [LastContactTime], [Station], [Row], [IP], [Cabinet], [RailSlot], [SizeU], [AssetTag], [SrvsTicket] FROM [BAR_HW]"; using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Resource res = new Resource(); res.Type = "BAR_HW"; res.Key = reader["ResourceId"]; res.Text = Convert.ToString(reader["Name"]); res.Attributes["ParentId"] = Convert.ToString(reader["ParentId"]); res.Attributes["Type"] = Convert.ToString(reader["Type"]); res.Attributes["BomId"] = Convert.ToString(reader["BomId"]); res.Attributes["Approved"] = string.Empty; resources.Add(res); } } } return resources; } private void LoadResources(Appointment apt) { using (DbConnection conn = OpenConnection()) { DbCommand cmd = DbFactory.CreateCommand(); cmd.Connection = conn; cmd.Parameters.Add(CreateParameter("@ScheduleId", apt.ID)); cmd.CommandText = "SELECT [ResourceId], [ParentId], [BomId], [Type], [Approved] FROM [ScheduleResource] WHERE [ScheduleId] = @ScheduleId"; using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { switch (Convert.ToString(reader["Type"])) { case "Person": Resource presource = Persons[Convert.ToInt32(reader["ResourceId"])]; presource.Attributes["ParentId"] = Convert.ToString(reader["ParentId"]); presource.Attributes["Type"] = Convert.ToString(reader["Type"]); presource.Attributes["BomId"] = Convert.ToString(reader["BomId"]); presource.Attributes["Approved"] = Convert.ToString(reader["Approved"]); apt.Resources.Add(presource); break; case "BAR_HW": Resource resource = BAR_HWs[Convert.ToInt32(reader["ResourceId"])]; resource.Attributes["ParentId"] = Convert.ToString(reader["ParentId"]); resource.Attributes["Type"] = Convert.ToString(reader["Type"]); resource.Attributes["BomId"] = Convert.ToString(reader["BomId"]); resource.Attributes["Approved"] = Convert.ToString(reader["Approved"]); apt.Resources.Add(resource); break; default: throw new InvalidOperationException("Unknown resource type: " + Convert.ToString(reader["Type"])); } } } } } public override IEnumerable<Appointment> GetAppointments(RadScheduler owner) { List<Appointment> appointments = new List<Appointment>(); using (DbConnection conn = OpenConnection()) { DbCommand cmd = DbFactory.CreateCommand(); cmd.Connection = conn; cmd.CommandText = "SELECT [ScheduleId], [Subject], [Start], [End], [RecurrenceRule], [RecurrenceParentID], [Email], [LastModified], [Description], [ProjectId], [TicketId], [QuicklookId], [Reminder], [AppointmentColor] FROM [Schedules]"; using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Appointment apt = new Appointment(); apt.Owner = owner; apt.ID = reader["ScheduleId"]; apt.Subject = Convert.ToString(reader["Subject"]); apt.Start = DateTime.SpecifyKind(Convert.ToDateTime(reader["Start"]), DateTimeKind.Utc); apt.End = DateTime.SpecifyKind(Convert.ToDateTime(reader["End"]), DateTimeKind.Utc); apt.RecurrenceRule = Convert.ToString(reader["RecurrenceRule"]); apt.RecurrenceParentID = reader["RecurrenceParentId"] == DBNull.Value ? null : reader["RecurrenceParentId"]; apt.Description = Convert.ToString(reader["Description"]); apt.Attributes["Email"] = reader["Email"].ToString(); apt.Attributes["ProjectId"] = reader["ProjectId"].ToString(); apt.Attributes["TicketId"] = reader["TicketId"].ToString(); apt.Attributes["QuicklookId"] = reader["QuicklookId"].ToString(); apt.Attributes["AppointmentColor"] = reader["AppointmentColor"].ToString(); apt.Attributes["LastModified"] = DateTime.SpecifyKind(Convert.ToDateTime(reader["LastModified"]), DateTimeKind.Utc).ToShortDateString(); if (apt.RecurrenceParentID != null) { apt.RecurrenceState = RecurrenceState.Exception; } else if (apt.RecurrenceRule != string.Empty) { apt.RecurrenceState = RecurrenceState.Master; } LoadResources(apt); appointments.Add(apt); } } } return appointments; } private void FillSchedResources(Appointment appointment, DbCommand cmd, object ScheduleId, string resType) { foreach (Resource resource in appointment.Resources.GetResourcesByType(resType)) { cmd.Parameters.Clear(); cmd.Parameters.Add(CreateParameter("@SchedleId", ScheduleId)); cmd.Parameters.Add(CreateParameter("@ResourceId", resource.Key)); cmd.Parameters.Add(CreateParameter("@ParentId", resource.Attributes["ParentId"])); cmd.Parameters.Add(CreateParameter("@Type", resource.Attributes["Type"])); cmd.Parameters.Add(CreateParameter("@BomId", resource.Attributes["BomId"])); cmd.Parameters.Add(CreateParameter("@Approved", resource.Attributes["Approved"])); cmd.CommandText = "INSERT INTO [ScheduleResource] ([ScheduleId], [ResourceId], [ParentId], [Type], [BomId], [Approved]) VALUES (@ScheduleId, @ResourceId, @ParentId, @Type, @BomId, @Approved)"; cmd.ExecuteNonQuery(); } } private void ClearSchedResources(object ScheduleId, DbCommand cmd) { cmd.Parameters.Clear(); cmd.Parameters.Add(CreateParameter("@ScheduleId", ScheduleId)); cmd.CommandText = "DELETE FROM [ScheduleResource] WHERE [ScheduleId] = @ScheduleId"; cmd.ExecuteNonQuery(); } private void PopulateAppointmentParameters(DbCommand cmd, Appointment apt) { cmd.Parameters.Add(CreateParameter("@Subject", apt.Subject)); cmd.Parameters.Add(CreateParameter("@Start", apt.Start)); cmd.Parameters.Add(CreateParameter("@End", apt.End)); cmd.Parameters.Add(CreateParameter("@Description", apt.Description)); cmd.Parameters.Add(CreateParameter("@Reminder", apt.Reminders)); cmd.Parameters.Add(CreateParameter("@Email", apt.Attributes["Email"])); cmd.Parameters.Add(CreateParameter("@LastModified", apt.Attributes["LastModified"])); cmd.Parameters.Add(CreateParameter("@ProjectId", apt.Attributes["ProjectId"])); cmd.Parameters.Add(CreateParameter("@TicketId", apt.Attributes["TicketId"])); cmd.Parameters.Add(CreateParameter("@QuicklookId", apt.Attributes["QuicklookId"])); cmd.Parameters.Add(CreateParameter("@AppointmentColor", apt.Attributes["AppointmentColor"])); string rrule = null; if (apt.RecurrenceRule != string.Empty) { rrule = apt.RecurrenceRule; } cmd.Parameters.Add(CreateParameter("@RecurrenceRule", rrule)); object parentId = null; if (apt.RecurrenceParentID != null) { parentId = apt.RecurrenceParentID; } cmd.Parameters.Add(CreateParameter("@RecurrenceParentId", parentId)); } public override void Insert(RadScheduler owner, Appointment appointmentToInsert) { if (!PersistChanges) { return; } using (DbConnection conn = OpenConnection()) using (DbTransaction tran = conn.BeginTransaction()) { DbCommand cmd = DbFactory.CreateCommand(); cmd.Connection = conn; cmd.Transaction = tran; PopulateAppointmentParameters(cmd, appointmentToInsert); cmd.CommandText = @" INSERT INTO [Schedules] ([Subject], [Start], [End], [RecurrenceRule], [RecurrenceParentID], [Email], [LastModified], [Description], [ProjectId], [TicketId], [QuicklookId], [Reminder], [AppointmentColor]) VALUES (@Subject, @Start, @End, @RecurrenceRule, @RecurrenceParentID, @Email, @LastModified, @Description, @ProjectId, @TicketId, @QuicklookId, @Reminder, @AppointmentColor)"; if (DbFactory is SqlClientFactory) { cmd.CommandText += Environment.NewLine + "SELECT SCOPE_IDENTITY()"; } else { cmd.ExecuteNonQuery(); cmd.CommandText = "SELECT @@IDENTITY"; } int identity = Convert.ToInt32(cmd.ExecuteScalar()); foreach (string resType in resourceKeys) { FillSchedResources(appointmentToInsert, cmd, identity, resType); } tran.Commit(); } } public override void Update(RadScheduler owner, Appointment appointmentToUpdate) { if (!PersistChanges) { return; } using (DbConnection conn = OpenConnection()) { using (DbTransaction tran = conn.BeginTransaction()) { DbCommand cmd = DbFactory.CreateCommand(); cmd.Connection = conn; cmd.Transaction = tran; PopulateAppointmentParameters(cmd, appointmentToUpdate); cmd.Parameters.Add(CreateParameter("@ScheduleId", appointmentToUpdate.ID)); cmd.CommandText = @"UPDATE [Schedules] SET [Subject] = @Subject, [Start] = @Start, [End] = @End, [RecurrenceRule] = @RecurrenceRule, [RecurrenceParentID]= @RecurrenceParentID, [Email] = @Email, [LastModified] = @LastModified, [Description] = @Description, [ProjectId] = @ProjectId, [TicketId] = @TicketId, [QuicklookId] = @QuicklookId, [Reminder] = @Reminder, [AppointmentColor] = @AppointmentColor WHERE [ScheduleId] = @ScheduleId"; cmd.ExecuteNonQuery(); ClearSchedResources(appointmentToUpdate.ID, cmd); foreach (string resType in resourceKeys) { FillSchedResources(appointmentToUpdate, cmd, appointmentToUpdate.ID, resType); } tran.Commit(); } } } public override void Delete(RadScheduler owner, Appointment appointmentToDelete) { if (!PersistChanges) { return; } using (DbConnection conn = OpenConnection()) { DbCommand cmd = DbFactory.CreateCommand(); cmd.Connection = conn; using (DbTransaction tran = conn.BeginTransaction()) { cmd.Transaction = tran; ClearSchedResources(appointmentToDelete.ID, cmd); cmd.Parameters.Clear(); cmd.Parameters.Add(CreateParameter("@ScheduleId", appointmentToDelete.ID)); cmd.CommandText = "DELETE FROM [Schedules] WHERE [ScheduleId] = @ScheduleId"; cmd.ExecuteNonQuery(); tran.Commit(); } } } }