2013-04-30 50 views
1

我很好,FK名稱爲「Table_Id」「TableId」在我的表中。但實體框架SQL生成器正在使用兩者。修復實體框架不一致FK下劃線

  • 映射協會(獨立協會,FK屬性可見):無下劃線
  • 約束協會(外鍵關聯):強調

這有點顯得很荒謬 - 從DB的角度有沒有什麼區別這兩種關係在這裏具有一致性似乎是顯而易見的。我正在建模首先。

我做錯了什麼或有什麼方法可以解決這個問題?


編輯: 通過請求,包括一個樣本。我創建了一個新的實體圖並生成了SQL。它驗證。下面是該模型腳本的示意圖和生成數據庫的快照。請注意Apple上的BasketId與Oranges上的Basket_Id。唯一的區別是選擇了「向Oranges實體添加外鍵屬性」。添加該關聯時。

enter image description here

-- -------------------------------------------------- 
-- Entity Designer DDL Script for SQL Server 2005, 2008, and Azure 
-- -------------------------------------------------- 
-- Date Created: 04/29/2013 23:38:07 
-- Generated from EDMX file: C:\data\web-trunk\TestEntities.Data\TestEntities.edmx 
-- -------------------------------------------------- 

SET QUOTED_IDENTIFIER OFF; 
GO 
USE [TestEntities]; 
GO 
IF SCHEMA_ID(N'dbo') IS NULL EXECUTE(N'CREATE SCHEMA [dbo]'); 
GO 

-- -------------------------------------------------- 
-- Dropping existing FOREIGN KEY constraints 
-- -------------------------------------------------- 


-- -------------------------------------------------- 
-- Dropping existing tables 
-- -------------------------------------------------- 


-- -------------------------------------------------- 
-- Creating all tables 
-- -------------------------------------------------- 

-- Creating table 'Baskets' 
CREATE TABLE [dbo].[Baskets] (
    [Id] int IDENTITY(1,1) NOT NULL 
); 
GO 

-- Creating table 'Apples' 
CREATE TABLE [dbo].[Apples] (
    [Id] int IDENTITY(1,1) NOT NULL, 
    [BasketId] int NOT NULL 
); 
GO 

-- Creating table 'Oranges' 
CREATE TABLE [dbo].[Oranges] (
    [Id] int IDENTITY(1,1) NOT NULL, 
    [Basket_Id] int NOT NULL 
); 
GO 

-- -------------------------------------------------- 
-- Creating all PRIMARY KEY constraints 
-- -------------------------------------------------- 

-- Creating primary key on [Id] in table 'Baskets' 
ALTER TABLE [dbo].[Baskets] 
ADD CONSTRAINT [PK_Baskets] 
    PRIMARY KEY CLUSTERED ([Id] ASC); 
GO 

-- Creating primary key on [Id] in table 'Apples' 
ALTER TABLE [dbo].[Apples] 
ADD CONSTRAINT [PK_Apples] 
    PRIMARY KEY CLUSTERED ([Id] ASC); 
GO 

-- Creating primary key on [Id] in table 'Oranges' 
ALTER TABLE [dbo].[Oranges] 
ADD CONSTRAINT [PK_Oranges] 
    PRIMARY KEY CLUSTERED ([Id] ASC); 
GO 

-- -------------------------------------------------- 
-- Creating all FOREIGN KEY constraints 
-- -------------------------------------------------- 

-- Creating foreign key on [Basket_Id] in table 'Oranges' 
ALTER TABLE [dbo].[Oranges] 
ADD CONSTRAINT [FK_BasketOrange] 
    FOREIGN KEY ([Basket_Id]) 
    REFERENCES [dbo].[Baskets] 
     ([Id]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION; 

-- Creating non-clustered index for FOREIGN KEY 'FK_BasketOrange' 
CREATE INDEX [IX_FK_BasketOrange] 
ON [dbo].[Oranges] 
    ([Basket_Id]); 
GO 

-- Creating foreign key on [BasketId] in table 'Apples' 
ALTER TABLE [dbo].[Apples] 
ADD CONSTRAINT [FK_BasketApple] 
    FOREIGN KEY ([BasketId]) 
    REFERENCES [dbo].[Baskets] 
     ([Id]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION; 

-- Creating non-clustered index for FOREIGN KEY 'FK_BasketApple' 
CREATE INDEX [IX_FK_BasketApple] 
ON [dbo].[Apples] 
    ([BasketId]); 
GO 

-- -------------------------------------------------- 
-- Script has ended 
-- ------------------------ 

+1

我認爲你有錯誤的映射,你的TableId列映射不正確。這就是EF使用默認的EF的原因。你可以發佈你的兩個實體類和映射(如果有的話)? – 2013-04-30 03:25:03

+0

完成。讓我知道如果這就是你的意思。 – shannon 2013-04-30 03:45:46

+0

這裏沒有什麼錯,你也可以用橙色來做同樣的事情,並且在Orange中也有'BasketId'。 – 2013-04-30 03:51:33

回答

2

你說得對,沒有從數據模型的角度不同,但有從對象模型的角度不同。

當您使用外鍵屬性時,外鍵ID被包含在實體中,但是當您不使用外鍵時,將自動使用外鍵。命名是實體框架「Convention over Configuration」策略的一部分。 EF看到一個名爲Basket_Id的屬性,並且沒有在實體中看到該屬性,所以它知道在不特別配置它的情況下使用此ID。

相比之下,當Ef看到BasketId並在實體中看到該屬性時,它知道將該字段映射到基礎BasketId列。

基本上,EF通過使用命名約定來區分兩種外鍵導航。你可以閱讀更多關於此這裏:

Entity Framework Navigation Property generation rules

如果你想改變這種行爲,你可以創建一個自定義命名約定,刪除默認的一個,並添加名字的東西,你想要的方式,自定義一個但是它很可能會導致與其他類型的導航衝突。

說實話,我覺得有點諷刺意味的是,如果您在定義導航屬性方面存在不一致的情況,您想抱怨一致性。如果對你來說一致性如此重要,堅持一個或另一個。

+1

有沒有諷刺。我不得不實現一個樞軸/映射表來彌補EF缺陷,並且揭示FKs將它們標記爲複合主鍵。但謝謝你的回答,鏈接特別解釋了理由。注意,在某些元素上顯示FK將是OM中的不一致,而不是DM。 – shannon 2013-04-30 06:27:53

+0

順便說一句。不一致的問題是我擔心,如果我發現我需要在未來披露更多FK,DM將會中斷。是的,我關心一致性,但我更關心什麼/爲什麼/如何在封面下發生的事情,所以我明白什麼期望。你的結論性評論比絕對必要的更爲對抗。畢竟,我確實問過我是否做錯了什麼。 – shannon 2013-04-30 06:35:53

+0

@Shannon - 我沒有對抗,我很困惑,爲什麼當你不一致時你擔心一致性。你總是可以使用數據屬性或流利的映射來配置它來做你想做的事情,所以沒有任何「破壞」的危險。我還會爭辯說,如果你對數據模型非常關注,那麼你應該按照你所希望的方式創建數據庫,然後使用Database First。 – 2013-04-30 07:02:54