2013-05-13 55 views
2

我在包含'Note'列的新DB中有表。我有舊的數據庫與同一個表具有相同的結構,沒有列'注意'。 我改變了EDMX,我從新的數據庫添加(映射)列'注'。但如果我想在舊的數據庫中使用edmx我有錯誤:列doest不存在...不在舊數據庫中的實體框架映射表

我試圖把代碼嘗試catch,但沒有succesfull。錯誤是在外面嘗試捕捉。

//---new version DB 
       try 
       { 
        vehicles = entities.Vehicle.Where(v => v.NumPlate == numPlate || v.Note == numPlate); 
       } 
       catch (Exception) 
       { 
        vehicles = entities.Vehicle.Where(v => v.NumPlate == numPlate); 
       } 
       //---old version DB 

       foreach (Vehicle vehicle in vehicles) //<------- ERROR 

我該如何解決? 謝謝

+0

爲什麼不使用版本系統來知道要連接到哪個數據庫?通過了解版本,您可以在不同情況下編寫不同的查詢。 – 2013-05-13 09:15:50

+0

那麼,如果我理解的很好,我必須創建新的實體表與新的列和由具體的實體表使用的版本? – Musketyr 2013-05-13 09:30:10

+0

是的,你需要不同的類附加到這些實體。因爲我知道EF沒有辦法通過單個類和實現來支持太多不同的實體表。 – 2013-05-13 09:37:52

回答

4

這是一種'黑客',但您可以選擇ignoreNote屬性,一旦你使用舊的數據庫。

尋找在你的context類的OnModelCreating方法,並將其替換:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     if (this.Database.Connection.Database == "Name_Of_Old_Database") 
      modelBuilder.Entity<Vehicle>().Ignore(x => x.Note); 
    } 

更新:

由於您使用.edmx映射和有目前沒有辦法修改映射在運行時我假設我的建議確實是錯誤的。

我還是不明白什麼是你想使用try/catch塊來實現的,這不要緊,你是否包括(失蹤)Note場查詢或不是,因爲Entity Framework實現模型不再與數據庫兼容,它將拒絕完全使用這個數據庫。

但2點要牢記:

  • 由於您使用的IQueryable,你try/catch確實是放錯了地方,除了將僅在Materialization試圖真實的檢索時,將引發(數據)。

    可以使用ToList方法(等等)物化查詢:

    entities.Vehicle.Where(v => v.NumPlate == numPlate || v.Note == numPlate).ToList();

    或移動try/catch塊以包裝foreach聲明。

  • 您可以使用System.Data.Entity.Database.CompatibleWithModel()方法來早期確定(例如在上下文初始化時)您的模型和數據庫是否仍然可以一起工作。

+0

雖然這很好,但數據庫標題是一樣的。我有一個值保存在數據庫當前版本的數據庫中。所以我認爲可以修改以獲得版本的價值,然後使用黑客。 – Musketyr 2013-05-13 11:53:39

+0

您可以嘗試使用'this.Database.Connection'公開的任何內容區分數據庫。在兩者之間的連接參數中必定有不同的東西(如果不是數據庫名稱,那麼可能是主機)。 – haim770 2013-05-13 12:28:59

+0

連接可能非常不同,它取決於客戶計算機上的安裝 - 因此我無法使用此屬性。 – Musketyr 2013-05-14 04:54:28