簡體   English   中英

代碼優先:將實體映射到現有數據庫表

[英]Code-first: Mapping entities to existing database tables

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

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

我已經設置了Database.SetInitializer(null),因為我不希望EF更改我的架構。

數據庫架構:

在此輸入圖像描述

守則一:

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'。

這是因為我的數據庫表是Project而不是Projects 我不想將我的上下文的DbSet<Project>重命名為“Project”,因為這在語義上是不正確的。

題:

我是否必須使用流暢的API /數據注釋來在Project數據庫表和DbSet<Project> Projects集合之間進行映射?

你可以使用

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

針對Project實體的注釋,或者在OnModelCreating(DbModelBuilder modelBuilder)您可以調用modelBuilder.Entity<Project>().ToTable("Project");

兩者都會做同樣的事情。

您應該定義一個繼承自泛型類EntityTypeConfiguration(T)的類(即: ProjectMap ),其中T是您的Project類。 在此ProjectMap類中,您可以顯式定義表映射:

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

應該在DbContext類的以下方法中調用ProjectMap

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM