Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码优先:将实体映射到现有数据库表_C#_.net_Entity Framework_Entity Framework 5_Entity Framework 6 - Fatal编程技术网

C# 代码优先:将实体映射到现有数据库表

C# 代码优先:将实体映射到现有数据库表,c#,.net,entity-framework,entity-framework-5,entity-framework-6,C#,.net,Entity Framework,Entity Framework 5,Entity Framework 6,我首先对现有数据库使用EntityFramework6代码,但在将实体映射到数据库表时遇到问题 通常,我会使用数据库优先的方法并生成实体和上下文代码,但使用设计器已经成为一个巨大的难题 我已经设置了Database.SetInitializer(null),因为我不希望EF更改我的架构 数据库架构: public class Project { public int ProjectId { get; set; } public string Name { get; set; }

我首先对现有数据库使用EntityFramework6代码,但在将实体映射到数据库表时遇到问题

通常,我会使用数据库优先的方法并生成实体和上下文代码,但使用设计器已经成为一个巨大的难题

我已经设置了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();
}

先编码:

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”,因为这在语义上是不正确的

问题:

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();
}
我是否必须使用fluent API/数据注释在项目数据库表和
DbSet Projects
集合之间进行映射?

您可以使用

[Table("Project")] 
public class Project {
....
}
针对项目实体的注释,或者在
OnModelCreating(DbModelBuilder-modelBuilder)
中,可以调用
modelBuilder.entity().ToTable(“项目”)

两者都可以做同样的事情。

您应该定义一个类(即:
ProjectMap
),该类继承自泛型类
entitypeconfiguration(T)
,其中
T
是您的
项目
类。 在这个
ProjectMap
类中,您可以明确定义一个表映射:

this.ToTable("Project", "dbo");
ProjectMap
应该在
DbContext
类的以下方法中调用

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

这些是否会识别我的表键、约束和关系,或者我必须明确说明这些?我不知道。我认为键应该是可以的,因为您使用的是Entity+Id的约定,但是重新映射表可能会导致问题(对不起,IDK)。您的键有KeyAttribute注释,并且可以在ModelBuilder中映射这些注释和关系;表必须称为Projects soemthing出错,但正如您所说,您可以使用数据注释强制使用名称[table(“Projects”)]。在创建DBContext之前,尝试调用初始值设定项;把它放在外面的某个地方。由于提到了
EntityTypeConfiguration
,它使每个模型的映射保持干净和分离。