Сложный тип, игнорируемый кодом Entity Framework First - PullRequest
2 голосов
/ 02 декабря 2011

Построение по ответу Ладислава на

Код 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();
    }
}   

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

Оказывается, что Entity Framework не нравится универсальный класс EfObservableCollection<T>.

Если я извлекаю неуниверсальный класс из этого класса, данные сохраняются, как и ожидалось:

[ComplexType]
public class EfObservableCollectionString : EfObservableCollection<string>
{
}
0 голосов
/ 15 декабря 2012

Объединение backspace со списком строк приводит к очистке последнего символа в каждом элементе строки.Я думаю, что сериализация в JSON с использованием System.Web.Script.Serialization.JavaScriptSerializer лучше.

...