【问题标题】:Influencing how entity classes are created in EF 6 code-first from database影响如何在 EF 6 代码优先从数据库中创建实体类
【发布时间】:2015-09-11 11:46:27
【问题描述】:

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

我们现在正在升级到 EF 6.1.3,并且正在调查是否使用 .edmx 模型。我们肯定仍然希望控制我们的数据库架构 - 因此我们将使用 SQL 脚本创建新表等,然后从现有数据库生成 EF 模型(.edmx 或只是代码类)。

在试用 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 类型的三个导航属性 - 但它称它们为 Contact、Contact1、Contact2 - uuuuuggghHHHH!

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

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

在 EF 4.1 及更高版本中,您可以将 T4​​ 模板添加到 .edmx 并影响生成过程 - 如果您正在执行“从现有数据库生成代码优先”方法,那么使用 EF6 是否仍然可以这样做?我再也找不到任何关于该主题的博文或文章.....

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

【问题讨论】:

  • @JulieLerman:对此有何想法(作为英孚女王?:-))
  • @RowanMiller:你有什么想法或技巧来处理这个问题吗?
  • 在 EF6 中没有 PT 吗?! visualstudiogallery.msdn.microsoft.com/…
  • 我总是使用 Power Tools 的 beta 版本,它生成正常。然后在 VS 中添加 T4 模板。唯一的问题是您必须生成所有可能需要一段时间的对象。
  • 不知道这是否有帮助,但你见过efreversepoco.codeplex.com

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


【解决方案1】:

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

【讨论】:

  • 我没有一个.edmx文件......这是从数据库生成到code-first(或仅代码)C# 类 - 不再有 .edmx 文件.....
  • @marc_s 我的阅读很差。我已经先编写代码并且编写实体映射还不错,如果我没看错的话,这将缓解您的问题。否则,我会生成 edmx 并在需要时对其进行编辑。
【解决方案2】:

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

  • 我在 Codeplex 上尝试了“EF Reverse Poco”项目,但对它一点也不满意

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

  • 我尝试了 Entity Framework 6.1.3 Code Templates for C# NuGet 包 - 效果也很好,非常好,但与 Power Tools 存在相同的问题 - 要真正改变任何东西,需要对对象模型进行大量挖掘

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多