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

时间:2011-12-01 23:10:51

标签: entity-framework-4 ef-code-first

以Ladislav对

的回答为基础

Entity Framework Code First and Collections of Primitive Types

我正在尝试在EfObservableCollection<T>周围创建一个包装器类型ObservableCollection<T>,它有一个额外的帮助器属性来简化持久性(当然这个解决方案有权衡,但对我的域来说似乎是可行的)

但是,EF似乎忽略了EfObservableCollection<T>类型的属性。没有在数据库中创建适当的列。猜测实现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; }
}

包装类

[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 个答案:

答案 0 :(得分:5)

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

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

[ComplexType]
public class EfObservableCollectionString : EfObservableCollection<string>
{
}

答案 1 :(得分:-1)

将退格键与字符串列表连接会导致清除每个字符串项中的最后一个字符。 我认为使用System.Web.Script.Serialization.JavaScriptSerializer对json进行序列化更好。