2010-07-07 54 views
1

我公司有一個遺留應用程序仍在使用中。我正在將它移植到asp.net(使用mvc框架),並且還必須創建新的功能。因爲它在使用中,所以我必須在現有數據庫之上開發它,這是非常糟糕的(不是所有的關係都存在,觸發器用來代替關係,很多字段不再使用)所以我打算以後創建一個新的數據庫。我打算製作一個不同的EF模型,但要保持所有名稱空間和類名相同,是對的嗎?如果我想將其切換回來,該怎麼辦?如何組織我的代碼,模型等......以便更輕鬆地切換到不同的數據庫。 我真的很感激任何幫助。模型之間的實體框架切換

編輯更確切地說,我想讓我的應用程序在舊數據庫和新數據庫上運行。請記住,2個數據塊的架構不同

回答

1

如果您想將兩個不同的數據庫視爲同一個數據庫,就您的應用程序而言,您需要在它們之間建立一個抽象層來隱藏差異。

我想你在這裏有幾個選擇。一種方法是使用兩種不同的EF模型,然後您可以看到存儲庫模式以抽取它們之間的差異。第二種選擇是做某種條件映射。

您還沒有非常具體的數據庫之間的差異,所以很難給每個選項的具體例子,但對於第一次的總體思路是,你寫的表示存儲的接口,如:

interface IAnimalRepository 
{ 
    IQueryable<Animal> SelectAll(); 
    Animal Insert(Animal newRecord); 
    // etc. 
} 

現在,您將針對此界面編寫服務/業務層,而不是直接針對上下文。

您可以實現,說「老」 EF映射,像這樣的接口:

class AnimalRepository: IAnimalRepository 
{ 
    private OldEntities Context { get; set; } 

    public AnimalRepository(OldEntities context) 
    { 
     this.Context = context; 
    } 

    IQueryable<Animal> IAnimalRepositorySelectAll() 
    { 
     return from oa in Context.OldAnimals 
       select new Animal // Animal is a POCO 
       { 
        Id = oa.Id, 
        Name = oa.Name 
       }; 
    } 

    // etc. 
} 

第二個選擇是做一個條件映射。在這種情況下,您將使用當前位於CTP for Entity Framework 4中的新Code First功能,該功能允許您在運行時指定表名和行名。

在這兩個選項中,我可能會選擇存儲庫模式選項,因爲我想你會想要使用存儲庫模式。它使單元測試和其他問題變得更簡單。但是任何一個都會工作。

0

我有一個類似的情況,我有一個非ef基於Oracle的應用程序。我將它切換到基於SQL Server EF的數據庫系統,並重新構建了應用程序。當你移植到一個新的框架(ASP MVC)時,我會做的也是再次啓動數據庫。你可以做的就是編寫c#代碼來執行從舊數據庫到新數據庫的導入,在導入過程中執行字段之間的任何轉換等。當我進行了轉換時,我每晚都要從舊系統導入新系統,這樣用戶就可以利用新系統瞭解現有數據。

+0

我其實想過了,但問題是輸入到新數據庫中的數據也應該是老的。所以如果我使用這種方法,我將不得不實現一個導出功能,或者進行某種同步 – kalan 2010-07-07 11:02:06

+0

是的,你可能需要做某種同步,但應該可以通過比較時間戳找出最近的數據。 – Calanus 2010-07-07 11:49:50