2012-11-24 22 views
2

考慮使用EF Code First使用的這兩個POCO類。擴展POCO類以使用其他上下文進行計算

public class Sale 
{ 
    public int SaleId { get; set; } 
    public DateTime Date { get; set; } 
    public double Amount { get; set; } 
} 

public class History 
{ 
    public int HistoryId { get; set; } 
    public DateTime Date { get; set; } 
    public double Total { get; set; } 
} 

這是一切都很好,但其實我是想我上課的時候,我用它在我的應用程序代表更多:

public class SaleWithAllIWant 
    { 
     public int SaleId { get; set; } 
     public DateTime Date { get; set; } 
     public double Amount { get; set; } 
     public double Calculation // Read only and NOT stored in DB 
     { 
      get 
      { 
       // Obtain Total from _Context.History on Date 
       // Perform Calculation 
      } 
     } 
    } 

我希望能夠使用EF的美麗和能夠做到這樣的事情:

gridSales.DataSource = _Context.Sales.ToList(); 

但是,銷售不包括我所有的信息。 SaleWithAllIWant不是一個上下文,所以我不得不做一些類似的後屠宰從Sale到SaleWithAllIWant。我可以使用未綁定的列或類似的東西,但會變得雜亂,並開始影響性能。

我不能只將SaleWithAllIWant放入我的POCO類中,因爲計算需要知道歷史上下文。我的DAL項目(創建DbSets)引用了我的Model項目(其中包含POCO類) - 所以Model項目無法引用DAL以訪問上下文,因爲它是循環引用。

解決方案只是把它們全部放在一起,而沒有單獨的DAL和Model項目?

我懷疑有更好的方法我錯過了。所有的評論非常感謝。

回答

1

將DAL和Model合併在一起絕對是一個選項,我會考慮如果您不單獨部署它們。

也就是說,Calculation看起來像一個擴展方法的最佳候選:

public static class SaleExtensions 
{ 
    public static double Calculation(this Sale sale)   
    { 
      // Obtain Total from _Context.History on Date 
      // Perform Calculation 
    } 
} 

可能住在你的DAL項目。如果您需要在Sale中保留任何其他屬性以進行計算,則只需將其標記爲[NotMapped],以便EF將忽略它們。

+0

謝謝@Serge。合併可能的路要走。擴展方法是一個好主意,但我無法將其綁定到擴展方法,就好像它是Sale類中的屬性那樣?我仍然需要使用某種調用擴展的未綁定列?謝謝 – user1622713

+0

@ user1622713我不完全確定你綁定了什麼(看起來像WebForms或WinForms中的DataGrid),但是你絕對應該能夠在不擴展模型的情況下顯示計算值。如果你可以提供更多的細節,答案會更容易。 –

相關問題