2011-11-03 41 views
0

這是vs。2010中的.net 4我有多個具有相同結構的數據庫。我們最終會將它們合併爲一個,但這樣做很順利。我正在編寫一個應用程序,而不必編寫相同的代碼10次,我想動態地在模型之間切換。我很接近但並不完全。繼承人我有什麼:在ADO.NET實體模型之間動態切換

using esOrderHeader = Shipping.Models.esShip.OrderHeader; 

using fnOrderHeader = Shipping.Models.fnShip.OrderHeader; //OrderHeader is a table in the database 

    ObjectContext context = null; 

    IEnumerable< EntityObject> orderHeader = null; //i've tried ObjectSet as well 

    switch (client) 
    { 

     case "es": 
        context = new esshipEntities(); 
        orderHeader = context.CreateObjectSet<esOrderHeader>(); 
        break; 

     case "fn": 
        context = new fnshipEntities(); 
        orderHeader = context.CreateObjectSet<fnOrderHeader>(); 
        break; 

    } 

var query = from row in orderHeader where row.IsFulfilled == false select row; 

下不會編譯,因爲編譯器顯示「無法解析符號IsFulfilled」,這是在我的表中的字段。我如何在實體之間切換並能夠對它們運行linq查詢?

+0

它無法解決row.IsFulfilled因爲orderHeader是IEnumerable類型的。我不確定這是否會起作用,但是您可以嘗試爲您的Shipping.Models.esShip.OrderHeader(還有fnShip)創建超類,並將IsFulfilled屬性放在那裏,然後使用該超類而不是EntityObject?我會試試這個,讓你知道它是否適用於我... – neeKo

+0

順便說一句,而不是'row.IsFilledilled == false'你可以放在'!row.IsFulfilled':) – neeKo

+0

那麼,我的編譯成功(不通過製作數據庫就無法測試)。你有沒有運氣? – neeKo

回答

2

什麼將幫助你使你的代碼編譯(儘管我不確定它是否是一個好的解決方案:)),爲不同的船舶製造OrderHeaders的超類。

namespace Shipping.Models 
{ 
    class CommonOrderHeader 
    { 
     public bool IsFulfilled { get; set; } 
    } 
} 

namespace Shipping.Models.fnShip 
{ 
    class OrderHeader : CommonOrderHeader 
    { 

    } 
} 

namespace Shipping.Models.esShip 
{ 
    class OrderHeader : CommonOrderHeader 
    { 

    } 
} 

這種方式,而不是IEnumerable<EntityObject> orderHeader = null;您使用IEnumerable<CommonOrderHeader> orderHeader = null;

由於EntityObject不包含財產IsFulfilled,您的代碼不編譯。 CommonOrderHeader包含此字段,因此,您的代碼編譯。

希望你得到這個工作:)

+0

感謝發佈,我希望我也能得到這個工作。我沒有看到我能如何以這種方式工作,因爲實體模型類是由visual studio自動生成的,如果設計者將模型的表格放在與模型相同的類中,而不是單獨的類中,這不會成爲問題。我希望這是有道理的 – Clif

+0

是的,我知道你在說什麼,這可能會造成問題,但是,我有另一種解決方案:如果由於它們被生成而無法使用超類,那麼可以使用一個類具有您感興趣的屬性(即您試圖選擇的屬性),然後將您的查詢放入開關中並使其返回該類型的對象。這是一個可接受的解決方案嗎? – neeKo

+0

如果我知道你在說什麼,那不就是我試圖避免重複代碼的意思嗎? – Clif

0

該代碼對我來說看起來不錯...您可以檢查實體的「IsFulfilled」屬性是否正確地映射到數據庫表? 「Orderheader」實際上應該是一個Ienumerable ..這就是你寫你的LINQ查詢對..是嗎?我能想到的唯一的事情是如果對象被映射正確嗎?另外,兩個獨立的edmx文件中是否有esshipentities和fnshipentities?

+0

是esshipentities和fnshipentities是兩個獨立的edmx文件。 IsFulfilled被正確映射,因爲我已經對OrderHeader表運行了查詢,當我像下面這樣實例化對象時: – Clif

+0

var orderHeader = context.CreateObjectSet (); – Clif