我正在为我自己的应用调整Windows Phone Database Example using MVVM。这里建议使用getter / setter组合在模型对象上包装EntitySet
属性,允许使用IEnumerable
(使用Assign
方法)进行分配,例如。
// Example method from a model class 'SomeModelObject'
[Association(Storage = "_todos", OtherKey = "_categoryId", ThisKey = "Id")]
public EntitySet<ToDoItem> ToDos
{
get { return this._todos; }
set { this._todos.Assign(value); }
}
但是,当我尝试实例化一个具有EntitySet
属性的对象时,它将不允许它,例如。
SomeModelObject myModelObject = new SomeModelObject() {
Property1 = "foo",
Property2 = true,
// Following raises an error, even though setter should allow assignment
// from an IEnumerable (because of the use of 'Assign' in the setter)
ToDos = new List<ToDoItem>() {
new ToDoItem(),
},
};
错误如下,
Error 1 Cannot implicitly convert type
'System.Collections.Generic.List<SomeApp.ToDoItem>' to
'System.Data.Linq.EntitySet<SomeApp.ToDoItem>'
如何实例化从EntitySet
引用的对象?
答案 0 :(得分:3)
嗯,您发布的代码存在两个问题。
我怀疑主要问题是,当属性类型为List<ToDoItem>
时,您尝试将属性值设置为EntitySet<ToDoItem>
。 (您发布的错误消息与您发布的代码不符,但没关系。)您说“应该允许从IEnumerable
分配,但我不知道您为什么会这样做鉴于该财产的声明,情况就是这样:
public EntitySet<ToDoItem> ToDos { ... }
该属性 类型为IEnumerable<ToDoItem>
。
由于某种原因,你还两次使用new SomeModelObject
:
SomeModelObject myModelObject = new SomeModelObject() {
new SomeModelObject() {
Property1 = "foo",
...
}
};
我假设你的真正的代码看起来更像这样:
SomeModelObject myModelObject = new SomeModelObject() {
Property1 = "foo",
...
};
将来请更加小心 - 诊断未发布的代码非常困难。
EntitySet
附近有三个选项。
如果您要将新项目添加到现有 EntitySet<ToDoItem>
,您可以在对象初始值设定项中执行此操作:
SomeModelObject myModelObject = new SomeModelObject {
Property1 = "foo",
Property2 = true,
ToDos = {
new ToDoItem(),
}
};
或者,如果要设置属性本身的值,则需要创建新的EntitySet<ToDoItem>
:
SomeModelObject myModelObject = new SomeModelObject {
Property1 = "foo",
Property2 = true,
ToDos = new EntitySet<ToDoItem> {
new ToDoItem(),
}
};
这似乎不太可能是一个好主意,我实际上建议将setter设为私有。
或者,如果您真的想要分配任何IEnumerable<ToDoItem>
,您只需更改属性的类型:
[Association(Storage = "_todos", OtherKey = "_categoryId", ThisKey = "Id")]
public IEnumerable<ToDoItem> ToDos
{
get { return this._todos; }
set { this._todos.Assign(value); }
}