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

Influencing how entity classes are created in EF 6 code-first from database

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

我们现在正在升级到 EF 6.1.3,我们正在研究是否使用或不使用该 .edmx 模型。我们肯定仍然希望控制我们的数据库模式 - 所以我们将使用 SQL 脚本创建新的 tables 等,然后生成 EF 模型(.edmx 或者只是来自现有数据库的代码 classes)。

在试用 Visual Studio 2013 期间,当 EF 6 从现有数据库创建 classes 时,我注意到一个烦人的地方。 我有一个 Customer class 链接到 Contact class 三次 - 一次用于 DesignContact,一次用于 SalesContact,第三次SupportContact 的时间。这些在 Customer table.

中存储为 DesignContactId (INT) 等列

您可以使用此 T-SQL:

创建那些 classes
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),
)

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

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

在 EF 4.1 及更高版本中,您可以将 T4​​ 模板添加到 .edmx 并影响生成过程 - 如果您正在执行 "Generate code-first from existing database" 方法,EF6 是否仍然可能以某种方式实现?我再也找不到关于该主题的任何博客 post 或文章......

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

您可以在 .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>

感谢大家的参与 - 我尝试了各种方法:

  • 我尝试了 Codeplex 上的 "EF Reverse Poco" 项目,但对它一点都不满意

  • 我尝试了适用于 EF 6 的 EF Power Tools - 它工作得很好。这让我可以添加 T4 模板来影响代码生成过程。有效 - 但现在的挑战是理解用作代码生成基础的对象模型(这似乎没有记录......)

  • 我尝试了 Entity Framework 6.1.3 Code Templates for C# NuGet 包 - 也可以很好地工作,但与 Power Tools 有相同的问题 - 实际改变任何东西,大量挖掘对象模型将需要