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

mar*_*c_s 8 c# sql-server code-first entity-framework-6 visual-studio-2013

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

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

在我使用Visual Studio 2013进行试验期间,我注意到当EF 6从现有数据库创建类时,这是一个烦人的问题.我有一个Customer课程,连接Contact三个班级 - 一次为第DesignContact一次,SalesContact第三次为SupportContact.它们存储DesignContactId (INT)Customer表格中的等列中.

您可以使用此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),
)
Run Code Online (Sandbox Code Playgroud)

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

  • 这个Customer类有我的三xxxContactId列作为字段 - 这是预期的
  • EF还生成类型的三个导航性能Contact-但它调用它们Contact,Contact1,Contact2- uuuuuggghHHHH!

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

  • 他们不直观 - 哪一个指向现在联系?
  • 如果Contact引入第四种关系,它们是"稳定的",还是会随着时间而改变?不确定.....(找不到任何关于此的文档)
  • 只是他们的名字是绝对可怕的......为什么他们不被称为DesignContact(基于DesignContactId),SalesContact(基于SalesContactId)等?

在EF 4.1及更高版本中,您可以将T4模板添加到.edmx并影响生成过程 - 如果您正在使用"从现有数据库生成代码优先"方法,那么仍然可以以某种方式使用EF6吗?我找不到任何关于该主题的博客文章或文章.....

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

mar*_*c_s 0

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

  • 我在 Codeplex 上尝试了“EF Reverse Poco”项目,但对此不太满意

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

  • 我尝试了C# NuGet 包的实体框架 6.1.3 代码模板 - 也可以很好地工作,但与 Power Tools 具有相同的问题 - 要实际更改任何内容,需要深入研究对象模型