2015-08-22 27 views
0

我們已經開始使用EF6作爲重寫我們的應用程序套件的一部分。現有套件中有許多完全合理的表,我們正在使用數據庫優先方法重用它們。我的問題是,EF6似乎在我的數據庫優先模型上強制執行我認爲是代碼優先的約定。實體框架6數據庫優先和Foriegn密鑰命名約定

考慮用正是如此定義,並適當地用幾行填充的兩個表這個小例子:

CREATE TABLE [dbo].[Table1] (
[Id] INT NOT NULL PRIMARY KEY, 
[Table2Reference] INT NOT NULL REFERENCES [dbo].[Table2](Id)) 

CREATE TABLE [dbo].[Table2] (
[Id] INT NOT NULL PRIMARY KEY, 
[SomeColumn] NVARCHAR(25)) 

我們得到這種模式運行的更新型號從數據庫之後:

(哎呀沒有足夠的聲譽發表圖片,它是你想象的東西。)

到目前爲止好,但是當你編寫代碼來訪問表1的實體,像這樣......

var q = _context.Table1.ToList(); 
foreach (var item in q) 
    Debug.WriteLine("{0}", item.Table2Reference); 

...它編譯得很好,但會拋出ToList()行。這是因爲生成的SQL包含的列的要求,即不存在一樣:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Table2Reference] AS [Table2Reference], 
[Extent1].[Table2_Id] AS [Table2_Id] <-- this one doesn't exist 
FROM [dbo].[Table1] AS [Extent1] 

我收集這個事做與外鍵代碼優先命名約定。我知道我可以將Table2的Id列重命名爲Table2Id,並將Table2Reference重命名爲Table2Id,它將起作用。但是,這應該是數據庫優先。有沒有什麼方法可以告訴EF擺脫困境,只需要使用預先定義的數據庫中的內容?我很早就發現我不得不關閉名稱複數慣例,但我似乎無法確定一個關閉慣例來解決這個問題。我試圖刪除這些:

modelBuilder.Conventions.Remove<PrimaryKeyNameForeignKeyDiscoveryConvention>(); 
modelBuilder.Conventions.Remove<TypeNameForeignKeyDiscoveryConvention>(); 
modelBuilder.Conventions.Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>(); 

無論如何,我很難過。有沒有簡單的解決方法,不涉及修改現有的數據庫?

感謝您的閱讀。

回答

0

您可以使用數據註釋屬性或流利API將EF映射配置爲實際的數據庫表。下面是如何將其與屬性來完成:

[Table("Table1")] 
public class Table1 
{ 
    public int Id { get; set; } 
    public int Table2Reference { get; set; } 

    [ForeignKey("Table2Reference")] 
    public Table2 Table2 { get; set; } 
} 
+0

謝謝亞歷克斯。然而,作爲數據庫優先,我不認爲我會註釋模板生成的實體類。下次生成代碼時所做的更改將被覆蓋。此外,它似乎不應該我必須。這種關係在數據庫中有明確的定義。我希望有一些事情可以告訴EF,只要按照數據庫中的方式進行即可。這是有點數據庫的第一點,我想:使用EF與現有的未修改的數據庫。 – Geetz

+0

@Geetz你使用EF電動工具來生成這些類嗎? – ranquild

+0

呃,我不這麼認爲。我從一個數據庫開始,打開一個圖表,並從數據庫中選擇更新模型。我沒有聽說過EF電動工具,但我會檢查出來。編輯:好的,確實。你在談論「逆向工程師代碼優先」嗎?這似乎很有趣。 – Geetz

0

事實證明,有一個非常重要的一塊到數據庫,第一種方法除了具有一個EDMX文件。也就是說,您的連接字符串必須包含以下部分:

metadata = res:// /IPE.csdl|resources /IPE.ssdl|res://*/IPE.msl; (用您的EDMX的基本名稱替換IPE)

否則,EF將無法在程序集中找到EDMX信息,並且代碼優先約定可以發揮作用。大多數情況下工作,直到他們沒有。

相關問題