2016-08-14 10 views
1

親愛的程序員容易結合,的DbContext的有或無WCF

我有,我不能成功找出問題,更關係到我應該如何設計的應用程序,到現在爲止我總是通過編寫大量代碼來克服這個問題。

我必須設計一個連接到數據庫的silverlight應用程序,我想在這兩個之間使用WCF服務有很多原因。

如果我使用WCF服務,我將放棄dbcontext結構,當我們想要使用CollectionViewSource和相關字段來綁定xaml控件時,它非常好。

例如,讓我們說我們有簡單的實體,如認爲,從EDMX文件生成:電阻和ResistorCategories

public partial class ResistorCategories 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public ResistorCategories() 
    { 
     this.Name = "New"; 
     this.ResistorsSet = new HashSet<ResistorsSet>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<ResistorsSet> ResistorsSet { get; set; } 
} 

public partial class ResistorsSet 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public ResistorsSet() 
    { 
     this.ResistorStockEntriesSet = new HashSet<ResistorStockEntriesSet>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public decimal Resistance { get; set; } 
    public Nullable<decimal> PowerRating { get; set; } 
    public Nullable<decimal> Price { get; set; } 
    public Nullable<decimal> Tolerance { get; set; } 
    public string SupplierCode { get; set; } 
    public string ManufacturerCode { get; set; } 
    public int ResistorCategories_Id { get; set; } 
    public Nullable<int> Suppliers_Id { get; set; } 
    public Nullable<int> Manufacturers_Id { get; set; } 

    public virtual ResistorCategories ResistorCategories { get; set; } 
    public virtual Suppliers Suppliers { get; set; } 
    public virtual Manufacturers Manufacturers { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<ResistorStockEntriesSet> ResistorStockEntriesSet { get; set; } 
} 

在XAML,這是很容易放置2 DataGrid和看名單

在XAML:

的屬於一個類別電阻n個I每個DataGrid綁定到其相應的CollectionViewSource:

ItemsSource="{Binding Source={StaticResource resistorCategoriesViewSource}, UpdateSourceTrigger=PropertyChanged}" 
ItemsSource="{Binding Source={StaticResource resistorCategoriesResistorsViewSource}, UpdateSourceTrigger=PropertyChanged}" 

而在代碼隱藏文件,用惰性加載啓用:

System.Windows.Data.CollectionViewSource resistorCategoriesViewSource = 
       ((System.Windows.Data.CollectionViewSource)(this.FindResource("resistorCategoriesViewSource"))); 
     // 
     _context.ResistorCategoriesSet.Load(); 
     resistorCategoriesViewSource.Source = _context.ResistorCategoriesSet.Local; 

因此,它不能更容易顯示他們的相關領域的記錄,但在這種情況下,xaml客戶端直接查詢數據庫,這是我想通過WCF服務避免的,並且增加了一些標準化和安全性。

對於WCF,首先必須使用EF Power Tool生成POCO對象,因爲它無法通過示例返回IEnumerable,因爲它的虛擬屬性(即使我禁用了惰性加載和代理)。 後來我有分離的集合查詢和存儲的POCO對象: 的ObservableCollection & &的ObservableCollection

然後我每個DataGrid綁定到其收集和監控將selectedItem事件手動更改電阻器顯示在數據網格收藏!

所以我想有一個解決方案使用WCF和簡單的dbcontext! 請幫幫我!在此先感謝

+0

你使用什麼樣的數據庫? MySql,MsSQL,Postgres? –

+0

嗨,Thx爲您的留言!我實際上在此項目中使用SQLEXPRESS,通常我大部分時間都使用MySql。我還沒有找到解決方案,所以我決定在其他地方節省時間:我已經實現了wcf數據服務,所以我幾乎不必寫wcf服務,我可以使用集成機制來保護它。我也可以使用它作爲xaml內的數據源,所以我只需拖放表單和數據網格即可。當然,最後一件事是關於我的帖子,我必須加載並手動進行綁定! –

回答

0

所以我終於找到了解決方案,即使解決方案很簡單,也值得搜索:使用WCF數據服務

有可能與所有相關實體來查詢數據庫,並在XAML約束他們:

作爲例子,考慮稱爲ItemsCategory與項目通過ItemCategory_Id領域涉及它的列表的實體,和2個其他實體所謂Ite​​mPrices和ItemImages通過ITEM_ID領域涉及的項目:

  • ItemsCategory
    • 項目
      • ItemPrices
      • ItemImages

這並不完美,但它看起來像那樣。

那麼接下來,如果你想放置的ItemsCategory一個DataGrid,看到在第二DataGrid中的相關項目,以及相關的ItemPrices和ItemImages在第三和第四的DataGrid在XAML中,你將它定義這樣的:

<navigation:Page.Resources> 
    <CollectionViewSource x:Key="itemsCategoriesSetViewSource" d:DesignSource="{d:DesignInstance SvcCatalogDatabase:ItemsCategories, CreateList=True}"/> 
    <CollectionViewSource x:Key="itemsCategoriesSetItemsSetViewSource" Source="{Binding Items, Source={StaticResource itemsCategoriesSetViewSource}}"/> 
    <CollectionViewSource x:Key="itemsCategoriesSetItemsSetItemsPricesSetViewSource" Source="{Binding ItemsPrices, Source={StaticResource itemsCategoriesSetItemsSetViewSource}}"/> 
    <CollectionViewSource x:Key="itemsCategoriesSetItemsSetItemsImagesSetViewSource" Source="{Binding ItemsImages, Source={StaticResource itemsCategoriesSetItemsSetViewSource}}"/> 
</navigation:Page.Resources> 

要加載的實體首先定義一個收藏這樣的:

public DataServiceCollection<ItemsCategories> ItemsCategoriesTracked { get; set; } 
public CollectionViewSource ItemsCategories_CVSrc { get; set; }  

,並查詢您只需要查詢ItemCategories與相關實體的數據庫:

ItemsCategories_CVSrc.Source = null; 
ItemsCategoriesTracked.LoadAsync(this.SvcData.ItemsCategoriesSet.Expand("Items").Expand("Items/ItemsPrices,Items/ItemsImages")); 

當然,你已經定義的處理程序的DataServiceCollection的LoadCompleted事件:

ItemsCategoriesTracked.LoadCompleted += new EventHandler<LoadCompletedEventArgs>((sender, e) => DataServiceCollection_LoadCompleted<ItemsCategories>(sender, e, ItemsCategories_CVSrc)); 

private void DataServiceCollection_LoadCompleted<T>(object sender, LoadCompletedEventArgs e, CollectionViewSource target) 
    { 
     if (e.Error == null) 
     { 
      if ((sender as DataServiceCollection<T>).Continuation != null) 
      { 
       (sender as DataServiceCollection<T>).LoadNextPartialSetAsync(); 
      } 
      else 
      { 
       target.Source = (sender as DataServiceCollection<T>); 
      } 
     } 
     else 
     { 
      MessageBox.Show(string.Format("{0}: An error has occured: {1}", typeof(T).Name, e.Error.Message)); 
     } 
    } 

而且你鏈接的CollectionViewSource在XAML中定義的:

ItemsCategories_CVSrc = (CollectionViewSource)this.Resources["itemsCategoriesSetViewSource"]; 

瞧!希望它能幫助別人!

0

也許,您可以根據示例數據提供者實現您自己的「數據提供者」:Entity Framework 5 Sample Provider。但是你需要「隧道」和序列化數據發送/接收通過wcf。

0

Thx對於你的信息,我想是的,最後我將不得不這樣做,我正在努力尋找一個簡單的解決方案,但我想我想做什麼是不可能的。

我不應該用綁定來節省時間,而應該專注於節省數據服務生成的時間。wcf數據服務是一個很好的解決方案,我也嘗試codetrigger,我實際上試圖實施它與開放ria服務.....這似乎是越野車作爲地獄!

所以我不太清楚,我可以使用wcf數據服務來完成數據部分,但是我希望silverlight應用程序也可以按順序檢索asp.net應用程序中當前已通過身份驗證的用戶的名稱和角色定製用戶界面。所以我想我必須使用第二個wcf服務。

我也許在做夢,但如果可能的話,我希望Silverlight應用程序在用戶登錄或註銷時接收通知,而不是一直查詢asp.net應用程序。

如果我找到解決方案,當然我會發布它,因爲我認爲當有人想要編寫Silverlight應用程序時,這是很常見的。