0

我正在为我自己的应用程序使用 MVVM 调整 Windows Phone 数据库示例。在这里,它建议使用允许使用(使用方法)EntitySet分配的 getter/setter 组合来包装模型对象上的属性,例如IEnumerableAssign

// 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>'

如何实例化从 a 引用的对象EntitySet

4

1 回答 1

3

好吧,您发布的代码有两个问题。

我怀疑主要问题是您试图将属性的值设置为 aList<ToDoItem>当属性的类型是EntitySet<ToDoItem>. (您发布的错误消息与您发布的代码不匹配,但没关系。)您说它“应该允许从 an 分配IEnumerable,但我不知道为什么您会期望这种情况,给定属性的声明:

public EntitySet<ToDoItem> ToDos { ... }

该属性不是type 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 设为私有。

或者,如果您真的希望能够分配 any IEnumerable<ToDoItem>,您可以更改属性的类型:

[Association(Storage = "_todos", OtherKey = "_categoryId", ThisKey = "Id")]
public IEnumerable<ToDoItem> ToDos
{
    get { return this._todos; }
    set { this._todos.Assign(value); }
}
于 2012-10-27T18:47:46.220 回答