2010-08-14 33 views
8

考慮下面的POCO類表:命名約定產生了許多一對多使用EF4 CTP4代碼第一種方法

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, 
    ... 

有誰知道是否有可能改變這種情況下產生的列名,並且可選地也改變了表名,使員工是認證過嗎?

感謝, 加里

回答

7

我用流利的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 }); 
+0

感謝這個有用的答案,但你能告訴我如何改變這個生成的表,例如:添加額外的列? – 2014-05-05 10:12:16

8

任何人絆倒這個現在使用EF的較新版本可能需要更改最後一節@gxclarke回答:

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

看起來好像方法參數已經改變爲只接受動作而不是表名。

+0

感謝您的回答。考慮到過去幾年框架的變化,不一定很容易獲得最新的EF在線幫助。 – 2012-12-16 13:31:00