2012-10-27 64 views
0

我正在修改我自己的應用程序Windows Phone Database Example using MVVM。在此建議使用getter/setter組合將EntitySet屬性包裝在模型對象上,該組合允許使用IEnumerable(使用Assign方法)進行分配,例如使用Assign方法。如何在C#中使用對象初始值設定項來初始化包含在getter/setter中的EntitySet?

// 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引用的對象?

回答

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

這似乎不太可能是一個好主意,雖然,其實我建議把二傳手私人。

或者,如果你真的希望能夠分配任何IEnumerable<ToDoItem>,你可以改變屬性的類型:

[Association(Storage = "_todos", OtherKey = "_categoryId", ThisKey = "Id")] 
public IEnumerable<ToDoItem> ToDos 
{ 
    get { return this._todos; } 
    set { this._todos.Assign(value); } 
} 
+0

首先,是的,你說得對,我已經調整了代碼,試圖得到最簡單的情況 - 我已經更新了這個問題。其次,我認爲你可以將一個IEnumerable分配給實體集合的原因是因爲使用'Assign'的setter,並且根據http://msdn.microsoft.com/en-us/library/bb299765.aspx,它接受IEnumerable的。 – Brendan

+1

@Brendan:'Assign'接受'IEnumerable ',但這不是屬性的類型,是嗎? 「Assign」的使用僅僅是一個實現細節。 –

+0

好吧,這很棒,它現在使用類型化的EntitySet進行編譯,但是如果我正在創建一個新對象,那麼在什麼情況下'ToDos'屬性會被預先存在? – Brendan