【问题标题】:Fix Entity Framework inconsistent FK underscore修复 Entity Framework 不一致的 FK 下划线
【发布时间】:2013-04-30 02:23:04
【问题描述】:

我可以在我的表中使用“Table_Id”OR“TableId”的 FK 名称。但是实体框架 SQL 生成器同时使用了这两者。

  • 映射关联(独立关联,FK 属性可见):无下划线
  • 约束关联(外键关联):下划线

这似乎有点荒谬——从数据库的角度来看,这两种关系之间没有区别,因此在这里保持一致性似乎很明显。我正在构建模型。

是我做错了什么还是有什么办法可以解决这个问题?


编辑: 根据要求,包括样品。我创建了一个新的实体图并生成了 SQL。它验证。这是图表和从模型脚本生成数据库的快照。请注意 Apples 上的 BasketId 与 Oranges 上的 Basket_Id。唯一的区别是选择了“将外键属性添加到'Oranges'实体”。添加该关联时。

-- --------------------------------------------------
-- 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
-- ------------------------

【问题讨论】:

  • 我认为您的映射有误,您的 TableId 列未正确映射。这就是 EF 使用默认值的原因。你能发布你的两个实体类和映射(如果有的话)吗?
  • 完成。让我知道你是否是这个意思。
  • 这里没有错。你也可以对橙色做同样的事情,在橙色中也有BasketId
  • 重现性不代表正确。是的,我可以更改我的模型并在所有模型上公开 FK 以隐藏看起来不一致的地方。我不明白为什么会出现不一致。

标签: entity-framework entity-framework-5 ef-model-first


【解决方案1】:

你是对的,从数据模型的角度来看没有区别,但从对象模型的角度来看是有区别的。

当您使用外键属性时,外键 ID 会包含在实体中,但当您不使用外键时,则会静默使用外键。命名是实体框架“约定优于配置”策略的一部分。 EF 看到了一个名为 Basket_Id 的属性,并没有看到实体中的属性,所以它知道使用这个 id 而无需专门配置它。

相比之下,当 Ef 看到 BasketId 并看到实体中的属性时,它就知道将该字段映射到底层的 BasketId 列。

基本上,EF 通过使用命名约定来区分两种类型的外键导航。您可以在此处阅读更多相关信息:

Entity Framework Navigation Property generation rules

如果您想更改此行为,您可以创建自定义命名约定,删除默认命名约定,然后添加自定义命名约定,以您想要的方式命名,但这很可能会导致与其他类型的导航发生冲突.

老实说,当您定义导航属性的方式不一致时,您想抱怨一致性,这有点讽刺。如果一致性对您来说如此重要,请坚持使用其中一种。

【讨论】:

  • 没有讽刺意味。我必须实现一个数据透视表/映射表来弥补 EF 的不足,并显示 FK 以将它们标记为复合主键。但是感谢您的回答,该链接特别解释了理由。旁注,在某些元素上显示 FK 将是 OM 中的不一致,而不是 DM。
  • 顺便说一句。不一致的问题是我担心如果我发现我将来需要透露更多的 FK 会破坏 DM。是的,我关心一致性,但我更关心幕后发生的事情/为什么/如何发生,所以我明白会发生什么。你的结束评论比绝对必要的更具对抗性。毕竟,我确实问过我是不是做错了什么。
  • @Shannon - 我不是在对抗,我很困惑为什么当你自己不一致时你会担心一致性。您始终可以使用数据属性或流畅的映射将其配置为做任何您想做的事情,因此没有任何“破坏”的危险。我还认为,如果您非常关心数据模型,那么您应该以您希望的方式创建数据库并使用 Database First。
  • 感谢澄清。我在我的上一个项目中进行了数据库优先,这可能解释了我对 DM 输出的一些关键性的来源。但我希望在这个项目的部署/升级迁移上投入更少的精力。无论如何,这可能是一个白日梦,因为据我所知,模型优先迁移仍然不可用。
猜你喜欢
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2020-08-11
相关资源
最近更新 更多