Entity Framework Code First
- 5 minutes to read
A SchedulerDataStorage can be bound to a data source created using the Entity Framework Code First approach. The following code demonstrates how to implement appointment and resource objects.
Appointments
class EFAppointment
{
[Key]
public int UniqueID {get;set;}
[Required]
public int Type {get;set;}
[Required]
public DateTime StartDate {get;set;}
[Required]
public DateTime EndDate {get;set;}
public bool AllDay {get;set;}
public string Subject {get;set;}
public string Location {get;set;}
public string Description { get; set; }
public int Status {get;set;}
public int Label {get;set;}
public string ResourceIDs {get;set;}
public string ReminderInfo {get;set;}
public string RecurrenceInfo {get;set;}
}
Resources
class EFResource
{
[Key]
public int UniqueID { get; set; }
public int ResourceID { get; set; }
public string ResourceName { get; set; }
public byte[] Image { get; set; }
public int Color
{
get
{
return ColorEx.ToArgb();
}
set
{
ColorEx = new MyColor(value);
}
}
public MyColor ColorEx { get; set; }
}
class MyColor
{
public byte A { get; set; }
public byte R { get; set; }
public byte G { get; set; }
public byte B { get; set; }
public MyColor() { }
public MyColor(byte a, byte r, byte g, byte b) { A = a; R = r; G = g; B = b; }
public MyColor(Color color) { A = color.A; R = color.R; G = color.G; B = color.B; }
public MyColor(int argb)
{
byte[] bytes = BitConverter.GetBytes(argb);
A = bytes[0];
R = bytes[1];
G = bytes[2];
B = bytes[3];
}
public Color ToColor() { return Color.FromArgb(A, R, G, B); }
public static MyColor FromColor(Color color) { return new MyColor(color.A, color.R, color.G, color.B); }
public int ToArgb()
{
byte[] bytes = new byte[] { A, R, G, B };
return BitConverter.ToInt32(bytes, 0);
}
}
DbContext
The DbContext class descendant is required to retrieve data from the database. It is implemented as follows:
class SchedulerContext:DbContext
{
public DbSet<EFAppointment> EFAppointments { get; set; }
public DbSet<EFResource> EFResources { get; set; }
}
Mappings
Before binding to a data source we have to map data fields to appointment and resource properties. The code that creates the required mappings is shown below.
this.schedulerStorage1.Appointments.Mappings.AllDay = "AllDay";
this.schedulerStorage1.Appointments.Mappings.AppointmentId = "UniqueID";
this.schedulerStorage1.Appointments.Mappings.Description = "Description";
this.schedulerStorage1.Appointments.Mappings.End = "EndDate";
this.schedulerStorage1.Appointments.Mappings.Label = "Label";
this.schedulerStorage1.Appointments.Mappings.Location = "Location";
this.schedulerStorage1.Appointments.Mappings.RecurrenceInfo = "RecurrenceInfo";
this.schedulerStorage1.Appointments.Mappings.ReminderInfo = "ReminderInfo";
this.schedulerStorage1.Appointments.Mappings.ResourceId = "ResourceIDs";
this.schedulerStorage1.Appointments.Mappings.Start = "StartDate";
this.schedulerStorage1.Appointments.Mappings.Status = "Status";
this.schedulerStorage1.Appointments.Mappings.Subject = "Subject";
this.schedulerStorage1.Appointments.Mappings.Type = "Type";
this.schedulerStorage1.Resources.Mappings.Caption = "ResourceName";
this.schedulerStorage1.Resources.Mappings.Color = "Color";
this.schedulerStorage1.Resources.Mappings.Id = "ResourceID";
this.schedulerStorage1.Resources.Mappings.Image = "Image";
Database Initialization
Handle the Form.Load event to create the database, fill it with initial data and specify appointment and resource binding sources.
Database.SetInitializer(new SchedulerContextSeedInilializer());
context = new SchedulerContext();
context.Database.Initialize(false);
context.EFAppointments.Load();
context.EFResources.Load();
eFAppointmentBindingSource.DataSource = context.EFAppointments.Local.ToBindingList<EFAppointment>();
eFResourceBindingSource.DataSource = context.EFResources.Local.ToBindingList<EFResource>();
Not the use of the System.Data.Entity.DbExtensions.ToBindingList<T> method as the source for data binding.
Database Commit
The SaveChanges method of DbContext descendant - the SchedulerContext object - is used to commit changes to the data source. Subscribe to the SchedulerDataStorage.AppointmentsInserted, SchedulerDataStorage.AppointmentsChanged and the SchedulerDataStorage.AppointmentsDeleted events to save the SchedulerContext object.
To exclude the identity field from the fields being committed to the data source, set the AppointmentStorage.CommitIdToDataSource property to false.