2011-12-01 102 views
2

大厦拉吉斯拉夫的答案被忽略到复杂类型由实体框架代码优先

Entity Framework Code First and Collections of Primitive Types

我试图给ObservableCollection<T>有一个额外的辅助特性来简化持久周围创建一个包装类型EfObservableCollection<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; } 
} 

包装类

[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(); 
    } 
} 

回答

5

事实证明,实体框架不喜欢泛型类EfObservableCollection<T>

如果我派生从该类非通用类,如预期的数据持久化:

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

加入与退格字符串列表,让清洁的最后一个字符在每个字符串项。 我想使用System.Web.Script.Serialization.JavaScriptSerializer序列化为json更好。