14

我使用實體框架6代碼優先與現有數據庫,但有問題將我的實體映射到數據庫表。代碼優先:將實體映射到現有數據庫表

通常情況下,我會使用數據庫優先的方法,並生成我的實體和上下文代碼,但使用設計器已成爲一個巨大的痛苦。

我已經設置Database.SetInitializer(null),因爲我不想EF來更改我的模式。

數據庫模式:

enter image description here

代碼第一:

public class Project 
{ 
    public int ProjectId { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 
} 

public class ReleaseControlContext : DbContext 
{ 
    public ReleaseControlContext() 
     : base(ConfigurationManager.ConnectionStrings["ReleaseControl"].ConnectionString) 
    { 
     Database.SetInitializer<ReleaseControlContext>(null); 
    } 

    public DbSet<Project> Projects { get; set; } 
} 

調用代碼:

using(var context = new ReleaseControlContext()) 
{ 
    var projects = context.Projects.ToList(); 
} 

以下異常被拋出:

SQLEXCEPTION:無效的對象名稱dbo.Projects「。

這是因爲我的數據庫表是項目而不是項目。我不想將我的上下文的DbSet<Project>重命名爲「Project」,因爲這在語義上不正確。

問:

我必須用流利的API /數據註解的項目數據庫表和DbSet<Project> Projects集之間進行映射?

+0

我wonderung爲什麼它不工作的下面的方法被調用;該表必須被稱爲項目,這樣做會出錯,但正如您所說的,您可以使用數據註釋來強制名稱[Table(「Projects」)]。 –

+0

嘗試在創建DBContext之前調用初始化程序;把它放在外面的某個地方。 –

回答

18

可以使用

[Table("Project")] 
public class Project { 
.... 
} 

註釋對項目實體,或在OnModelCreating(DbModelBuilder modelBuilder)你可以調用modelBuilder.Entity<Project>().ToTable("Project");

兩者都會做同樣的事情。

+0

這些都可以識別我的表鍵,約束和關係,還是我必須明確說明這一點? – davenewza

+0

我不知道。我會認爲按鍵*應該是可以的,因爲您使用的是實體+標識的約定,但重新映射表*可能會導致問題(對不起IDK)。您的鍵有KeyAttribute註釋,並且有能力在模型構建器中映射這些註釋和關係。 – AlexC

9

您應該定義一個繼承自通用類EntityTypeConfiguration(T)的類(即:ProjectMap),其中T在這裏是您的Project類。 在此ProjectMap類,你可以明確地定義表映射:

this.ToTable("Project", "dbo"); 

ProjectMap應該在你的DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new ProjectMap()); 
} 
+1

Upvoted提及'EntityTypeConfiguration',保持映射干淨,併爲每個模型分開。 –

相關問題