我們已經開始使用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>();
無論如何,我很難過。有沒有簡單的解決方法,不涉及修改現有的數據庫?
感謝您的閱讀。
謝謝亞歷克斯。然而,作爲數據庫優先,我不認爲我會註釋模板生成的實體類。下次生成代碼時所做的更改將被覆蓋。此外,它似乎不應該我必須。這種關係在數據庫中有明確的定義。我希望有一些事情可以告訴EF,只要按照數據庫中的方式進行即可。這是有點數據庫的第一點,我想:使用EF與現有的未修改的數據庫。 – Geetz
@Geetz你使用EF電動工具來生成這些類嗎? – ranquild
呃,我不這麼認爲。我從一個數據庫開始,打開一個圖表,並從數據庫中選擇更新模型。我沒有聽說過EF電動工具,但我會檢查出來。編輯:好的,確實。你在談論「逆向工程師代碼優先」嗎?這似乎很有趣。 – Geetz