使用 EF4 CTP4 代码优先方法生成的多对多表中的命名约定

Posted

技术标签:

【中文标题】使用 EF4 CTP4 代码优先方法生成的多对多表中的命名约定【英文标题】:Naming conventions in generated many-to-many table using EF4 CTP4 code first approach 【发布时间】:2010-08-14 05:56:07 【问题描述】:

给定以下 POCO 类:

public class Certification 
    public int Id  get; set; 
    public virtual ICollection<Employee> CertifiedEmployees  get; set; 


public class Employee 
    public int Id  get; set; 
    public virtual ICollection<Certification> Certifications  get; set; 

使用 EF4 CTP4 代码优先方法创建数据库模型确实会创建所需的联结表:

CREATE TABLE [dbo].[Certifications_CertifiedEmployees](
[Certifications_Id] [int] NOT NULL,
[CertifiedEmployees_Id] [int] NOT NULL,
    ...

但是,表名和列名并不理想,因为它们是从关联的类属性名生成的。我宁愿:

CREATE TABLE [dbo].[Employees_Certifications](
[Employee_Id] [int] NOT NULL,
[Certification_Id] [int] NOT NULL,
    ...

有谁知道在这种情况下是否可以更改生成的列名,并且还可以选择更改表名以使员工在认证之前?

谢谢, 加里

【问题讨论】:

【参考方案1】:

现在遇到此问题并使用更新版本的 EF 的任何人都可能需要将最后一部分 @gxclarke 的答案更改为:

  .Map(
      m => 
          m.MapLeftKey("Employee_Id");
          m.MapRightKey("Certification_Id");
          m.ToTable("Employees_Certifications");
      
   );

看起来方法参数已更改为仅接受操作而不接受表名。

【讨论】:

感谢您的回答。考虑到框架在过去几年中发生了很大变化,在线获取最新的 EF 帮助并不容易。【参考方案2】:

我使用fluent API修改生成的联结表:

modelBuilder.Entity<Employee>()
    .HasMany(e => e.Certifications)
    .WithMany(c => c.Employees)
    .Map("Employees_Certifications", (e, c) => new  
        Employee_Id = e.Id, 
        Certification_Id = c.Id );

【讨论】:

感谢这个有用的答案,但你能告诉我如何改变这个生成的表格,例如:添加额外的列吗?

以上是关于使用 EF4 CTP4 代码优先方法生成的多对多表中的命名约定的主要内容,如果未能解决你的问题,请参考以下文章

EF 4.1 代码优先:多对多

实体框架更改生成的多对多表的名称

Hibernate 创建冗余的多对多表

数据库优先方法中与联结表的多对多关系

实体框架代码优先的多对多关系的最佳方法

Mybatis的多表(多对多)查询