Класс сериализации для хранения базы данных сущностей

У меня есть атомарный класс, который я использую, чтобы пометить дни недели как значения true / false.

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 как один столбец. У меня есть POCO, который выглядит так:

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, я не могу установить значение.

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, но после поиска примеров я не совсем уверен, как его реализовать. Могу ли я изменить свою подписку Entity POCO SSRS_Subscription, чтобы добавить ее? Будем весьма благодарны за любые советы или подсказки о том, как сделать это лучше.

1 ответ

Решение

Это было решение, которое я придумал... Я создал интерфейс ISerialize, а затем мой POCO реализовал его...

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");
        }
    }
}

Затем я внес следующие изменения в мой 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 и вызывает функцию Serialize, которая принимает свойства, не связанные с сущностью, и сериализует их в JSON (в моем случае) и сохраняет их в свойствах сопоставленной строки которые представляют их.

Другие вопросы по тегам