EF / Code First Migration - 隐式表映射?

时间:2014-11-26 17:05:13

标签: c# entity-framework ef-code-first ef-migrations

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

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

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; }

3)运行add-migration和update-database命令

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

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

所以我想我的问题是:当我使用add-migration和update-database命令创建“MyTable”时,是否在幕后的某个地方自动生成了一个类到表的地图?如果是这样,我可以访问它并查看它吗?

1 个答案:

答案 0 :(得分:2)

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

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

对于属性也是如此,因此Property(t => t.Id).HasColumnName("Id");实际上没有做任何事情,因为属性将按惯例进行映射。当你超出约定时,你只需要显式映射。因此,如果您想将属性ID映射到名为Category_id的列,那么您需要一个列映射Property(t => t.Id).HasColumnName("Category_id");

阅读此MSDN文章,了解有关默认约定的更多信息。