Построение по ответу Ладислава на
Код Entity Framework First и коллекции примитивных типов
Я пытаюсь создать тип оболочки EfObservableCollection<T>
вокруг ObservableCollection<T>
, у которого есть дополнительное вспомогательное свойство для упрощения сохранения (конечно, у этого решения есть компромиссы, но оно кажется работоспособным для моего домена).
Однако свойства типа EfObservableCollection<T>
, похоже, игнорируются EF. В базе данных не созданы соответствующие столбцы. Предполагая, что реализация IEnumerable<T>
может заставить EF игнорировать этот тип, я прокомментировал эту реализацию без изменений в поведении.
Что мне здесь не хватает?
Класс сущности
public class A
{
[DataMember]
public long Id { get; set; }
[DataMember]
public string Text { get; set; }
// Tags is not persisted
[DataMember]
public EfObservableCollection<string> Tags { get; set; }
}
Класс Wrapper
[ComplexType]
public class EfObservableCollection<T> : IEnumerable<T>
{
const string VALUE_SEPARATOR = "\x8"; // Backspace character. Unlikely to be actually entered by a user. Assumes ASCII or UTF-8.
readonly string[] VALUE_SEPARATORS = new string[] { VALUE_SEPARATOR };
[NotMapped]
protected ObservableCollection<T> Collection { get; private set; }
public EfObservableCollection()
{
Collection = new ObservableCollection<T>();
}
[DataMember]
public string PersistHelper
{
get
{
string serializedValue = string.Join(VALUE_SEPARATOR, Collection.ToArray());
return serializedValue;
}
set
{
Collection.Clear();
string[] serializedValues = value.Split(VALUE_SEPARATORS, StringSplitOptions.None);
foreach (string serializedValue in serializedValues)
{
Collection.Add((T)Convert.ChangeType(serializedValue, typeof(T))); // T must implement IConvertable, else a runtime exception.
}
}
}
public void Add(T item)
{
Collection.Add(item);
}
IEnumerator<T> GetEnumerator()
{
return Collection.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}