实体框架代码首先忽略的复杂类型

Eri*_* J. 2 entity-framework-4 ef-code-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; }
}
Run Code Online (Sandbox Code Playgroud)

包装类

[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();
    }
}   
Run Code Online (Sandbox Code Playgroud)

Eri*_* J. 5

事实证明,Entity Framework不喜欢泛型类EfObservableCollection<T>.

如果我从该类派生非泛型类,则数据将按预期持久化:

[ComplexType]
public class EfObservableCollectionString : EfObservableCollection<string>
{
}
Run Code Online (Sandbox Code Playgroud)