C# EF/代码首次迁移-隐式表映射?

C# EF/代码首次迁移-隐式表映射?,c#,entity-framework,ef-code-first,entity-framework-migrations,C#,Entity Framework,Ef Code First,Entity Framework Migrations,我使用代码优先迁移方法在现有数据库中创建新表,我想知道这是否是在项目中的某个位置自动创建属性到字段的映射 例如:数据库中预先存在“Category”表。它是直接在SQL中创建的,我的MCV项目有一个CategoryMap.cs文件,该文件将类别实体属性显式映射到类别表字段: CategoryMap.cs this.ToTable("Category", "ctt"); this.Property(t => t.Id).HasColumnName("Id"); this.Property(t

我使用代码优先迁移方法在现有数据库中创建新表,我想知道这是否是在项目中的某个位置自动创建属性到字段的映射

例如:数据库中预先存在“Category”表。它是直接在SQL中创建的,我的MCV项目有一个CategoryMap.cs文件,该文件将类别实体属性显式映射到类别表字段:

CategoryMap.cs

this.ToTable("Category", "ctt");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.ClientId).HasColumnName("ClientId");
this.Property(t => t.CategoryTypeId).HasColumnName("CategoryTypeId");
etc.
db上下文类在OnModelCreating方法中显式指向此映射:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Configurations.Add(new CategoryMap());
etc.
通过这种设置,我可以将数据保存到Category表中,只要我将映射块保持在适当的位置

另一方面,我使用代码优先的方法创建了一个新表:

1) 创建一个“MyTable”实体类

2) 将此代码添加到我的上下文类:

public DbSet<MyTable> MyTable { get; set; }
public DbSet MyTable{get;set;}
3) 运行添加迁移和更新数据库命令

这在数据库模式中创建了一个“MyTable”表,我可以将数据保存到此表中,尽管我的db上下文类的OnModelCreating方法中没有映射文件,也没有显式的映射代码

现在,如果我注释掉上下文类中的“modelBuilder.Configurations.Add(new CategoryMap());”代码行,我将无法再将数据保存到该表中;当我尝试执行db.SaveChanges()时,我收到一条“table'Category'not found”错误消息


所以我想我的问题是:当我使用addmigration和updatedatabase命令创建“MyTable”时,类到表的映射是否在后台自动生成?如果是,我可以访问它并查看它吗?

没有自动生成的映射,但是如果没有特定映射,会应用一些映射约定。例如,如果没有显式表映射,则按照约定,它将映射到与类名匹配的表

因此,对于类
Category
,它将按照惯例映射到名为
Category
的表

属性也是如此,所以
Property(t=>t.Id)
实际上不做任何事情,因为属性将按照约定具有该映射。只有在超出约定时,才需要显式映射。因此,如果要将属性Id映射到名为
Category\u Id
的列,则需要一个列映射
property(t=>t.Id)


阅读本文了解有关默认约定的更多信息。

这很有意义;但是,如果是这种情况,为什么在删除显式类别映射时会出现错误“table'Category'not found”?我有一个Category实体类,所以惯例不应该是查找名为“Category”的表并找到它吗?这几乎就像是为了工作,必须使用代码第一次迁移创建表。如果有一个名为Category的表,那么它应该可以工作,错误似乎表明没有。我会被诅咒的。不知何故,“MyTable”表(通过迁移创建)位于“dbo”模式中,但其他表位于不同的模式中。所以我想这可以解释为什么即使“Category”表存在,仍然会抛出错误。我猜我必须使用OnModelCreating()方法来指定“Category”存在于不同的模式中?是的,您需要显式映射不在DBO模式中的表。您可以将模式指定为¨ToTable()`中的第二个参数。谢谢,这非常有帮助,我对代码优先约定和映射如何交互有了更好的理解;这可能是因为迁移数据和数据库不同步。例如:有人直接在SQL中创建了Category表,但您的迁移并不知道这一点。或者相反,您的迁移相信有这样一个表,但有人手动更改或删除了该表。最后,记住模式。如果在EF中指定了默认模式,并且映射或数据库反映了类别表的不同模式,则也会出现此错误。