/*
Enable-Migrations -ContextTypeName iSchedulerDB -MigrationsDirectory Migrations
Update-Database -TargetMigration $InitialDatabase
Add-Migration -name InitialDB -Force -Verbose
Update-Database -Verbose
Update-Database -TargetMigration InitialDB -Verbose -Force
Add-Migration -name UpdateDB_01 -Force -Verbose
Update-Database -TargetMigration UpdateDB_01 -Verbose -Force
Add-Migration -name UpdateDB_02 -Force -Verbose
*/
namespace Vrh.iScheduler
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using Vrh.XmlProcessing;
///
/// Az ütemezésekhez szükséges adatmodell (DBContext).
///
public class SchedulerDB : DbContext
{
#region Constructors
///
/// A DBContext elõállítása az alapértelmezett kapcsolati sztringgel.
///
public SchedulerDB() : this(ConnectionStringStore.GetSQL(SchConst.DEFAULT_SQLCONNECTIONSTRINGNAME)) { }
///
/// A DBContext elõállítása
/// paraméterben megadott kapcsolati sztringgel.
///
/// Szabványos és szabályos SQL kapcsolati sztring. (Nem megnevezés!)
public SchedulerDB(string connectionString) : base(connectionString)
{
// migráció ellenõrzése
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion(true));
}
#endregion Constructors
#region DbSets
///
/// Az ütemezendõ ojektumokat tartalmazó táblázat.
///
public virtual DbSet ScheduleObjects { get; set; }
///
/// Az ütemezendõ ojektumokon végezhetõ mûveleteket tartalmazó táblázat.
///
public virtual DbSet ScheduleOperations { get; set; }
///
/// Az ütemezéseket tartalmazó táblázat.
///
public virtual DbSet Schedules { get; set; }
///
/// Sorozat ütemezések azonosítói és típusai.
///
public virtual DbSet ScheduleSeries { get; set; }
#endregion DbSets
#region OnModelCreating
///
/// A EF CodeFirst-ben nem elvégezhetõ vagy módosítandó dolgokat ebben
/// az eseményben kell elvégezni.
///
///
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//modelBuilder.HasDefaultSchema("GoodBill");
//WA20160124: Sajnos az EF a kötelezõ idegen kulcsnál alapértelmezésként cascadeDelete értékét true-ra állítja,
// ami sok esetben nem megfelelõ (nem is értem, miért true a default :(( )
// Ahol ez elõfordul, ott a ForeignKey-eket itt kell definiálni.
// HasRequired = many oldal virtual property
// WithMany = ha a one oldalon lett definiálva ICollection a many-ra, akkor azt kell ide írni, egyébként üres
// HasForeignKey = many oldalon a foreign key mezõ
modelBuilder.Entity().HasRequired(v => v.ScheduleObject)
.WithMany(one => one.Schedules)
.HasForeignKey(t => t.ScheduleObjectId)
.WillCascadeOnDelete(false);
modelBuilder.Entity().HasRequired(v => v.ScheduleOperation)
.WithMany(one => one.Schedules)
.HasForeignKey(t => t.ScheduleOperationId)
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
#endregion OnModelCreating
public class SelectLists
{
public static void CreateSystemViews(string sqlconnectionstring)
{
const string createview = @"CREATE VIEW [iScheduler].[{0}] AS {1}";
const string dropview = @"IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[iScheduler].[{0}]')) DROP VIEW [iScheduler].[{0}];";
var sl = new Dictionary();
sl.Add("SelectList_Schedules", selecttxt_SelectList_Schedules);
sl.Add("SelectList_SchedulesActive", selecttxt_SelectList_SchedulesActive);
int numofall = 0, numofcreated = 0;
using (var dbc = new SchedulerDB(sqlconnectionstring))
{
foreach (var s in sl)
{
numofall++;
var dropviewtext = string.Format(dropview, s.Key);
var createviewtext = string.Format(createview, s.Key, s.Value);
dbc.Database.ExecuteSqlCommand(dropviewtext);
dbc.Database.ExecuteSqlCommand(createviewtext);
}
dbc.SaveChanges();
}
}
#region systemviewtexts
const string selecttxt_SelectList_Schedules = @"
SELECT TOP 100
[iScheduler].[Schedules].[Id] AS IID,
convert(varchar(25), [iScheduler].[Schedules].[Id]) + ' (' + convert(varchar(25), [OperationTime], 120) + ','
+ [iScheduler].[ScheduleObjects].[ObjectType] + ','
+ [iScheduler].[ScheduleObjects].[ObjectName] + ','
+ [iScheduler].[ScheduleOperations].[OperationName] + ','
+ (CASE WHEN [iScheduler].[Schedules].[State] = 0 THEN 'Active' ELSE 'Passive' END) + ')'
AS DDISPLAY
FROM [iScheduler].[Schedules]
INNER JOIN [iScheduler].[ScheduleObjects] ON [iScheduler].[Schedules].[ScheduleObjectId] = [iScheduler].[ScheduleObjects].[Id]
INNER JOIN [iScheduler].[ScheduleOperations] ON [iScheduler].[Schedules].[ScheduleOperationId] = [iScheduler].[ScheduleOperations].[Id]";
const string selecttxt_SelectList_SchedulesActive = selecttxt_SelectList_Schedules + @" WHERE [iScheduler].[Schedules].[State] = 0";
#endregion systemviewtexts
}
}
#region ScheduleObject class
///
/// Ütemezhetõ objektumokat tartalmazó táblázat.
/// Egy típus alatt egyedinek kell lennie az azonosítónak.
///
[Table("ScheduleObjects", Schema = "iScheduler")]
public partial class ScheduleObject
{
#region Properties
///
/// Az ütemezett objektum belsõ egyedi azonosítója.
///
[Key]
public int Id { get; set; }
///
/// Ütemezett objektum típusa.
///
[Required, MaxLength(100), Index("IX_ScheduleObject_ObjectTypeObjectId", 1, IsUnique = true)]
public string ObjectType { get; set; }
///
/// Ütemezett objektum azonosítója.
///
[Required, MaxLength(100), Index("IX_ScheduleObject_ObjectTypeObjectId", 2, IsUnique = true)]
public string ObjectId { get; set; }
///
/// Az ütemezett objektum publikus megnevezése.
///
[Required, MaxLength(200)]
public string ObjectName { get; set; }
///
/// Ütemezett objektumcsoport azonosítója.
///
[Required, MaxLength(100)]
public string ObjectGroupId { get; set; }
///
/// Gyûjtemény, mely azokat az ütemezéseket tartalmazza,
/// amelyekben az objektum szerepel.
///
public virtual ICollection Schedules { get; set; }
#endregion Properties
#region Constructor
///
/// A ScheduleObject alapértelmezett konstruktora,
/// melyben inicializálódik a Schedules gyûjtemény.
///
public ScheduleObject()
{
Schedules = new HashSet();
}
#endregion Constructor
}
#endregion ScheduleObject class
#region ScheduleOperation class
///
/// Ütemezhetõ objektumokon elvégezhetõ mûveletek.
/// Egy típus alatt egyedinek kell lennie az azonosítónak.
///
[Table("ScheduleOperations", Schema = "iScheduler")]
public partial class ScheduleOperation
{
#region Properties
///
/// A mûvelet egyedi belsõ azonosítója.
///
[Key]
public short Id { get; set; }
///
/// Ütemezett objektum típusa.
///
[Required, MaxLength(100), Index("IX_ScheduleOperation_ObjectTypeOperationId", 1, IsUnique = true)]
public string ObjectType { get; set; }
///
/// Ütemezett objektumon végezhetõ mûvelet "távoli" azonosítója.
///
[Required, MaxLength(100), Index("IX_ScheduleOperation_ObjectTypeOperationId", 2, IsUnique = true)]
public string OperationId { get; set; }
///
/// Ütemezett objektumon végezhetõ mûvelet "távoli" megnevezése.
///
[Required, MaxLength(200)]
public string OperationName { get; set; }
///
/// Gyûjtemény, mely azokat az ütemezéseket tartalmazza,
/// amelyekben a mûvelet szerepel.
///
public virtual ICollection Schedules { get; set; }
#endregion Properties
#region Constructor
///
/// A ScheduleOperation alapértelmezett konstruktora,
/// melyben a Schedules gyûjtemény inicializálása történik.
///
public ScheduleOperation()
{
Schedules = new HashSet();
}
#endregion Constructor
}
#endregion ScheduleOperation class
#region Schedule class
///
/// Ütemezéseket tartalmazó táblázat.
///
[Table("Schedules", Schema = "iScheduler")]
public partial class Schedule
{
#region Properties
///
/// Az ütemezés egyedi belsõ azonosítója.
///
[Key]
public int Id { get; set; }
///
/// Az adott (OperationTime) idõpontban végrehajtandó mûvelet ezen objektumhoz kapcsolódik.
///
public int ScheduleObjectId { get; set; }
///
/// Az adott (OperationTime) idõpontban végrehajtandó mûvelet azonosítója.
///
public short ScheduleOperationId { get; set; }
///
/// Ütemezés idõpontja, amikor végre kell hajtani a jelölt mûveletet a jelölt objektumon.
///
public DateTime OperationTime { get; set; }
///
/// Ütemezés állapota. Alapértelmezett értéke: ScheduleStates.Active (0)
///
[Index(IsUnique = false)]
public ScheduleStates State { get; set; }
///
/// Annak a sorozat ütemezésnek az azonosítója, mely alapján az egyedi ütemezés létrejött.
/// Ha nem sorozat ütemezés alapján (wizard) jön létre, akkor az értéke null.
///
public int? ScheduleSeriesId { get; set; }
///
/// Mûvelet végrehajtásakor visszakapott ReturnInfoJSON ReturnValue tulajdonság értékének tárolására.
///
/// Csak akkor kerül bele érték, ha az iSchedulerMonitor service hajtja végre ScheduleExecute akciót.
public int? ReturnValue { get; set; }
///
/// Mûvelet végrehajtásakor visszakapott ReturnInfoJSON ReturnMessage tulajdonság értékének tárolására.
///
/// Csak akkor kerül bele érték, ha az iSchedulerMonitor service hajtja végre ScheduleExecute akciót.
public string ReturnMessage { get; set; }
///
/// ScheduleObjectId idegen kulcshoz tartozó virtuális tulajdonság.
///
[ForeignKey("ScheduleObjectId")]
public virtual ScheduleObject ScheduleObject { get; set; }
///
/// ScheduleOperationId idegen kulcshoz tartozó virtuális tulajdonság.
///
[ForeignKey("ScheduleOperationId")]
public virtual ScheduleOperation ScheduleOperation { get; set; }
///
/// ScheduleSeriesId idegen kulcshoz tartozó virtuális tulajdonság.
///
[ForeignKey("ScheduleSeriesId")]
public virtual ScheduleSeriesOne ScheduleSeriesOne { get; set; }
#endregion Properties
#region Contructor
///
/// A Schedule alapértelmezett konstruktora, melyben a State, és
/// ScheduleSeriesId mezõk inicializálása történik meg.
///
public Schedule()
{
State = ScheduleStates.Active;
ScheduleSeriesId = null;
}
#endregion Contructor
}
#endregion Schedule class
#region ScheduleSeriesOne class
///
/// Sorozat ütemezéseket tartalmazó táblázat.
///
///
/// A név ütközött valami egyéb összetevõvel, ezért a típus kapott egy "One" suffix-et.
///
[Table("ScheduleSeries", Schema = "iScheduler")]
public partial class ScheduleSeriesOne
{
///
/// Sorozat egyedi belsõ azonosítója.
///
[Key]
public int Id { get; set; }
///
/// Sorozat típusa.
///
[Required, MaxLength(20)]
public string SeriesType { get; set; }
///
/// Sorozat megnevezése, amelyet meg is mutatunk a manager-ben összefûzve a típussal
/// TT-nnnnnnnn (id).
///
[Required, MaxLength(100)]
public string SeriesName { get; set; }
///
/// Sorozat színjelölése.
///
[MaxLength(30)]
public string SeriesColor { get; set; }
///
///
///
public virtual ICollection Schedules { get; set; }
}
#endregion ScheduleSeriesOne class
}