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)
事实证明,Entity Framework不喜欢泛型类EfObservableCollection<T>.
如果我从该类派生非泛型类,则数据将按预期持久化:
[ComplexType]
public class EfObservableCollectionString : EfObservableCollection<string>
{
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |