c# - 影响如何在 EF 6 代码优先中从数据库创建实体类

标签 c# sql-server visual-studio-2013 entity-framework-6 code-first

我们一直在使用 EF 4.0 以及使用 .edmx 模型的数据库优先方法。

我们现在正在升级到 EF 6.1.3,我们正在研究是否使用或不使用 .edmx 模型。我们肯定仍然希望控制我们的数据库模式 - 因此我们将使用 SQL 脚本创建新表等,然后从现有数据库。

在试用 Visual Studio 2013 期间,当 EF 6 从现有数据库创建类时,我注意到一个烦人的地方。 我有一个 Customer 类,它三次链接到 Contact 类 - 一次用于 DesignContact,一次用于 SalesContact 第三次是 SupportContact。这些在 Customer 表中存储为 DesignContactId (INT) 等列。

您可以使用此 T-SQL 创建这些类:

CREATE TABLE dbo.Contact
(
    ContactID INT NOT NULL 
        CONSTRAINT PK_Contact PRIMARY KEY CLUSTERED,
    Name VARCHAR(200),
    Address VARCHAR(200),
    ZipCode VARCHAR(20),
    City VARCHAR(100),
    Phone VARCHAR(100)
)

CREATE TABLE dbo.Customer
(
    CustomerID INT NOT NULL 
        CONSTRAINT PK_Customer PRIMARY KEY CLUSTERED,
    Name VARCHAR(200),
    -- other properties
    DesignContactID INT 
        CONSTRAINT FK_Customer_DesignContact
            FOREIGN KEY REFERENCES dbo.Contact(ContactID),
    SalesContactID INT 
        CONSTRAINT FK_Customer_SalesContact
            FOREIGN KEY REFERENCES dbo.Contact(ContactID),
    SupportContactID INT 
        CONSTRAINT FK_Customer_SupportContact
            FOREIGN KEY REFERENCES dbo.Contact(ContactID),
)

从数据库创建类时,我看到了:

  • Customer 类将我的三个 xxxContactId 列作为字段 - 这是预期的
  • EF 还生成了三个 Contact 类型的导航属性 - 但它称它们为 ContactContact1Contact2 - uuuuuggghHHHH!

我正试图找到一种方法来绕过那些非常糟糕的命名导航属性......这些很糟糕,因为:

  • 他们不直观 - 现在哪个指向哪个联系人?
  • 是否“稳定”,或者如果引入与 Contact 的第四种关系,它们是否会随时间变化?不确定......(找不到任何文档)
  • 只是他们的名字太可怕了......他们为什么不叫DesignContact(基于DesignContactId),SalesContact (基于 SalesContactId)等?

在 EF 4.1 及更高版本中,您能够将 T4 模板添加到 .edmx 并影响生成过程 - 如果您正在执行“生成代码 -首先从现有数据库”的方法?我再也找不到关于该主题的任何博客文章或文章......

或者是否有另一种方法可以影响 EF 生成类的方式 - 最显着的是导航属性?我可以定义某种自定义约定或其他东西来影响它吗?

最佳答案

您可以在 .edmx 文件中更改生成类的设置(通过记事本等)。只需在更改之前备份它。这并不理想,但它可以工作并且来自数据库的更新不会覆盖您的更改。

<EntityType Name="SomeEntityName" a:TypeAccess="Internal" xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration">
    <Key>
        <PropertyRef Name="Id" />
    </Key>
    <Property Name="Id" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
    <Property Name="Contact" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="false" />
    <Property Name="DesignContact" Type="String" Nullable="false" MaxLength="50" FixedLength="false" Unicode="false" />
</EntityType>

关于c# - 影响如何在 EF 6 代码优先中从数据库创建实体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32522770/

相关文章:

C# - 终止 Application.Run()

visual-studio-2013 - 在 F# 解决方案中找不到互操作程序集

mysql - 使用 Talend 快速启动数据库迁移

c++ - VS2013 的奇怪行为

tfs - TF270003 : Failed to copy

c# - 获取 Facebook Wall Facebook C# SDK -> 嵌套 JSON

c# - 不支持从 _ 到 _ 的关系,因为拥有的实体类型 _ 不能位于非所有权关系的主体端

c# - 使用来自另一个程序集的 WPF 样式

sql-server - SQL Server 2005 日期时间戳查询

sql-server - 如何使用 dplyr 连接 SQL Server 中表中多列的字符串?