0

私はアトミッククラスを持っています。私は、曜日と偽の値をフラグとして使用しています。エンティティデータベースストレージのシリアライズクラス

public class DaysOfWeek 
{ 
    public bool Sunday { get; set; } 
    public bool Monday { get; set; } 
    public bool Tuesday { get; set; } 
    public bool Wednesday { get; set; } 
    public bool Thursday { get; set; } 
    public bool Friday { get; set; } 
    public bool Saturday { get; set; } 

    public bool this[string day] 
    { 
     get 
     { 
      return (bool)GetType().GetProperty(day).GetValue(this, null); 
     } 
     set 
     { 
      GetType().GetProperty(day).SetValue(this, value); 
     } 
    } 
} 

これは、Entityを単一の列として使用して保存したいと考えています。

public class SSRS_Subscription 
{ 
    [Key] 
    public Guid id { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime? EndDate { get; set; } 
    public Recurrence RecurrencePattern { get; set; } 
    public DateTime StartTime { get; set; } 
    public int? MinuteInterval { get; set; } 
    public int? DaysInterval { get; set; } 
    public int? WeeksInterval { get; set; } 
    [NotMapped] 
    public DaysOfWeek DaysOfWeek 
    { 
     get 
     { 
      return SerializeHelper.DeserializeJson<DaysOfWeek>(internalDaysOfWeek); 
     } 
     set 
     { 
      internalDaysOfWeek = SerializeHelper.SerializeJson(value); 
     } 
    } 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    [Column("DaysOfWeek")] 
    public string internalDaysOfWeek { get; set; } 

    public SSRS_Subscription() 
    { 
     DaysOfWeek = new DaysOfWeek(); 
    } 
} 

ここでの問題は、私はDaysOfWeekプロパティにアクセスするとき、私は値を設定することができないということです。私はこのようになりますPOCOを持っています。私は私が必要なものと考えてい

var testSub = new SSRS_Subscription(); 
testSub.DaysOfWeek.Friday = true; 
// testSub.DaysOfWeek.Friday stays false (the default value) 

// However doing this sets the correct value... 
var tmpDaysOfWeek = testSub.DaysOfWeek; 
tmpDaysOfWeek.Friday = true; 
testSub.DaysOfWeek = tmpDaysOfWeek; 

はのObservableCollectionイベントですが、例のために検索した後、私はそれを実装する方法を正確にはわかりません。エンティティPOCO SSRS_Subscriptionを変更して追加しますか?どのようにこれをより良くするためのヒントやヒントをいただければ幸いです。

答えて

0

これは...

public interface ISerialize 
{ 
    void Serialize(); 
} 

public class SSRS_Subscription : ISerialize 
{ 
    [Key] 
    public Guid id { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime? EndDate { get; set; } 
    public Recurrence RecurrencePattern { get; set; } 
    public int? MinuteInterval { get; set; } 
    public int? DaysInterval { get; set; } 
    public int? WeeksInterval { get; set; } 
    [NotMapped] 
    public DaysOfWeek DaysOfWeek { get; set; } 

    [Column("DaysOfWeek")] 
    private string internalDaysOfWeek { get; set; } 

    [NotMapped] 
    public MonthsOfYear MonthsOfYear { get; set; } 


    [Column("MonthsOfYear")] 
    private string internalMonthsOfYear { get; set; } 

    public Catalog_Reports_Subscription() 
    { 
     DaysOfWeek = new DaysOfWeek(); 
     MonthsOfYear = new MonthsOfYear(); 
    } 

    public WhichWeek? MonthWhichWeek { get; set; } 

    public string Days { get; set; } 

    public void Serialize() 
    { 
     internalDaysOfWeek = SerializeHelper.SerializeJson(DaysOfWeek); 
     internalMonthsOfYear = SerializeHelper.SerializeJson(MonthsOfYear); 
    } 

    public class Configuration : EntityTypeConfiguration<SSRS_Subscription> 
    { 
     public Configuration() 
     { 
      Property(s => s.internalDaysOfWeek).HasColumnName("DaysOfWeek"); 
      Property(s => s.internalMonthsOfYear).HasColumnName("MonthsOfYear"); 
     } 
    } 
} 

私はその後、私のPOCOはそれを実装していたISerializeインターフェイスを作成した...と私が思いついた解決策だったそれから私は私のDbContextに次の変更を加えた:

public ReportingDbContext() : base("ReportingDbContext") 
    { 
     var objectContext = ((IObjectContextAdapter)this).ObjectContext; 
     objectContext.SavingChanges += new EventHandler(OnSavingChanges); 
    } 

    public void OnSavingChanges(object sender, EventArgs e) 
    { 
     foreach (ObjectStateEntry entry in 
      ((ObjectContext)sender).ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)) 
     { 
      if (!entry.IsRelationship && (entry.Entity is ISerialize)) 
      { 
       (entry.Entity as ISerialize).Serialize(); 
      } 
     } 
    } 

SaveChangesが呼び出されるたびに、SavingChangesは先に実行され、ISerializeを実装するオブジェクトを検索し、エンティティ以外のマップされたプロパティを取得してJSON(私の場合)にシリアル化してシリアル化するSerialize関数を呼び出し、マップされた文字列プロパティそれらを表す。

関連する問題