我使用代码优先迁移方法在现有数据库中创建新表,我想知道这是否在项目中的某处自动创建属性到字段映射。
例如:“类别”表预先存在于数据库中。它是直接在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”时,是否在幕后的某个地方自动生成了一个类到表的地图?如果是这样,我可以访问它并查看它吗?
答案 0 :(得分:2)
没有自动生成的映射,但是如果没有特定的映射,则会应用许多映射约定。例如,如果没有显式的表映射,那么按照惯例,它将映射到与类名匹配的表。
因此,对于类Category
,它将按惯例映射到名为Category
的表。
对于属性也是如此,因此Property(t => t.Id).HasColumnName("Id");
实际上没有做任何事情,因为属性将按惯例进行映射。当你超出约定时,你只需要显式映射。因此,如果您想将属性ID映射到名为Category_id
的列,那么您需要一个列映射Property(t => t.Id).HasColumnName("Category_id");
阅读此MSDN文章,了解有关默认约定的更多信息。