2011-11-22 30 views
4

我正在研究一個企業應用程序,該應用程序將包含一個豐富的WPF客戶端,該客戶端會與一堆webservices進行對話以檢索數據。這些數據是使用Code First EF 4.2創建的POCO。如何在基於WCF的場景中管理EF 4.2關聯

我現在面臨着一個概念性的問題,我一直在試圖圍繞我的頭,但無法找到一個好的解決方案。

1:N協會

因此數據模型是這樣的:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Person> Children { get; set; } 
} 

Serverside集團我有這需要附加新創建的DTOS(包括兒童收集新項目)的護理接口從客戶端到數據上下文並保存。這當然只適用於在客戶端創建這些實體然後發送添加的實體。該服務添加新實體並返回更新的實體(主要是Id屬性)。

[ServiceContract] 
public interface IMyPersonCaretaker 
{ 
    [OperationContract] 
    Person CreatePerson(Person entity) 
} 

然而,當我取回已經存在的實體,我不能編輯任何關聯(添加或刪除實體 - 因爲他們是固定的大小)。所以現在我就需要擴展接口,允許這樣的:

[ServiceContract] 
public interface IMyPersonCaretaker 
{ 
    [OperationContract] 
    Person CreatePerson(Person entity) 

    [OperationContract] 
    Person AddChild(Person parent, Person child) 
} 

這對我來說似乎是一個笨拙的方法和接口都越來越大,非常快。這是與POCO合作的複雜方法嗎?你怎麼做呢?

N:通過手動映射中號協會

數據模型的不同部分是這樣的:

public class ClassA 
{ 
    public int Id { get; set; } 
    public virtual ICollection<AtoBMapping> Mappings { get; set; } 
} 

public class ClassB 
{ 
    public int Id { get; set; } 
    public virtual ICollection<AtoBMapping> Mappings { get; set; } 
} 

public class AtoBMapping 
{ 
    public int Id { get; set; } 
    public virtual ClassA A { get; set; } 
    public virtual ClassB B { get; set; } 
} 

每當我試圖在客戶端創建ClassA和ClassB的的一個實例,並通過綁定將它添加到對方,當我嘗試將它添加到上下文中的Set時出現錯誤。該錯誤表示不允許從Mappings屬性中移除項目,並且我不真正瞭解這些來自哪裏。

第二部分可能有點過於抽象描述明智,如果有人需要更多的信息,我更願意添加它! PS:請不要建議Selftracking實體,我知道他們,但我真的會對純粹基於EF 4.2 POCOs的解決方案感興趣。

PPS:代碼是用手寫入這個窗口而不是實際使用的代碼,所以可能有東西丟失,但這不是我的問題的重點,所以我希望它就足夠了。

+1

您能否將更高級別的抽象作爲您的服務接口公開?我通常喜歡將我的所有數據模型代碼保存在服務中,並在服務上公開某種業務邏輯操作。因此,我可能不會使用像CreatePerson,AddChild這樣的方法,而是使用更類似於軟件中正在執行的操作的東西(難以在不知道您最終希望服務執行什麼的情況下進行解釋,對不起!)。 – kmp

+0

@ user1039947最終的目標功能是管理類似這樣的數據 - 簡單的類有幾個1:n的關聯和更少的n:m關聯。大部分時間數據正在被添加而不是被編輯。 – UrbanEsc

回答

1

我有一個類似的解決方案,我們需要一大堆CRUD類型的操作,但是我們的datamodel不會離開服務器,我們使用automapper將對象映射到單獨的DTO,這些DTO通常是WCF DatContract類並且沒有與領域模型一樣多的關係。

最初,這可能看起來像一個非常詳細的評論,但它最終得到回報,因爲你有很多明確的控制你的接口,在很多情況下,你並不需要轉移整個域模型關係)給客戶,客戶通常只能顯示這麼多的數據。

另一個選項可能是WCF DataServices,它們會使用RESTful接口來傳輸數據。

[新選項] i的過去基本上只是一個CRUD服務方法,需要一個字節數組使用

一個其它選項。 使用NetDataContractSerializer將對象圖序列化或從這些方法中反序列化。然後使用自定義客戶端來回傳輸數據,創建對象並將它們附加到DataContext以執行操作.... 類似this

+0

感謝您的建議,具有諷刺意味的是,由於冗長,我們剛剛從使用DTO切換到POCO。如果你有這種複雜的數據模型,我會同意這是一個更好的方法,但我們不是,它非常簡單。儘管如此,即使是DTO,您也需要管理Parent Child在某處的聯繫。 – UrbanEsc

+0

請參閱更新的新選項 –