2011-04-04 134 views
1

我在當前項目中使用實體框架4來從多個表中讀取數據。 使用ADO.net進行比較,它非常簡單,只需簡單的代碼即可完成大量的工作。表映射問題

但有一個問題...

E,G有和退出表調用表「MTable」 我只想從這個表中查詢兩個列,但是這個表是與另外兩名PPL份額誰也在努力。他們可能會在此表上添加列或修改約束。 我唯一確定的是,我想要查詢的兩列不會刪除或重命名。

我的應用程序現在正在運行,但不時它會因爲我從數據庫模式生成代碼而中斷,每次有人對「MTable」進行一些更新時,我需要更新我的應用程序的映射。

有沒有辦法做「代碼拳頭」的地圖,讓我寫一個簡單的模式映射到「MTable」,並只映射兩列,這樣我就可以不管什麼其他脂肪酶做什麼「 MTable「???

感謝

回答

1

你的問題很不清楚。你在說你是從你的模式中生成代碼,並且同時你在問是否有辦法先用代碼映射它。

DbContext API!=代碼第一種方法。人們應該在Fluent/Annotations映射和從代碼生成數據庫的代碼優先方法之間有所不同。如果您從數據庫生成代碼,那麼顯然使用數據庫優先方法。

數據庫優先解決方案:數據庫視圖,但它會使您的實體只讀。 Imho即使表格發生變化也不會有問題。如果您只需要兩列,並且沒有人會更改這兩列或創建新的所需列,則映射的團隊應該仍然可以工作。如果有人改變你的專欄,將不會有有效的方法來避免破壞你的代碼。

您還可以使用像QueryView(定位描述中的視圖)和DefiningQuery(定製選擇存儲描述中)的高級EDMX功能,但這些功能可能是針對您的方案矯枉過正的。

代碼優先解決方案:關閉模型元數據驗證和數據庫初始化。它需要設置初始化到null

// Use this code in the application start up 
Database.SetInitializer<MyContext>(null); 

和刪除IncludeMetadataConvetion

public class MyContext : DbContext 
{ 
    ... 

    protedte override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); 
    } 
} 

在兩種方法中,您還可以使用自定義的SQL查詢或自定義LINQ投影。

1

實體框架是不是真的爲這仍然是更改數據庫架構的理想選擇 - 所有的抽象後,您面對的是實體反映表模式,因此,如果這種情況正在改變它將打破英孚。但是沒有什麼可以阻止你只使用一個存儲查詢,讓您的兩列,並將其映射到具有性能匹配列的名稱你想有一個自定義類:

class MyColumns 
{ 
    public string Column1 {get;set;} 
    public string Column2 {get;set;} 
} 

... 

using(var context = new FooEntities()) 
{ 
    var results = context.ExecuteStoreQuery<MyColumns>("select Column1, Column2 from MTable"); 
} 
+0

是的..我在想同樣的事情..謝謝你的回答... – jojo 2011-04-04 01:46:54

1

我沒有嘗試過這一點,所以我不能說它可以和EF一起工作,但是你能定義一個你想要的兩列的直接選擇視圖,也許主鍵(如果主鍵不是你的兩列之一),然後構建你的EF模型反對的觀點。

這就是我們將如何將穩定的生產系統從過去的改變中隔離出來的好時光。

+0

這聽起來不錯......因爲我聽說有一個代碼優先的方式來工作EF4,我只是想知道..有可能是一種方法來只映射從一張桌子的一部分列..哈哈...... – jojo 2011-04-04 01:53:10

+0

這是一個好主意 – BrokenGlass 2011-04-04 01:55:45

0

當使用EF與大中型組合時,我們選擇創建數據庫項目,或者只是創建數據庫/測試數據的SQL腳本。在源代碼控制中使用此文件時,當團隊成員修改數據庫時,每個人都可以獲得最新的腳本/項目以及新的edmx,並且所有人都應該能夠工作。