如何使用C#中的对象初始值设定项初始化包含在getter / setter中的EntitySet?

时间:2012-10-27 16:39:40

标签: c# windows-phone-7 linq-to-sql

我正在为我自己的应用调整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引用的对象?

1 个答案:

答案 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); }
}