什么约定将poco属性自动映射到列?我该如何禁用自动映射
本文关键字:映射 何禁用 属性 约定 什么 poco | 更新日期: 2023-09-27 18:26:04
我有现有的poco模型和一个现有的数据库,我想与EF 6一起使用。然而,我的许多模型的属性并没有映射到数据库中的列。当EF向sql发送select语句时,它会像列一样询问这些属性,但由于列不存在,EF最终会引发"无效列名"异常。
EF 6中是否有一个约定,使所有poco属性都被视为列类型?如果是,哪个公约对此负责?如果没有,还有什么其他机制对这种行为负责,我该如何禁用它?
理想情况下,如果我在EntityTypeConfiguration中显式映射poco属性,我希望我的实现只将其视为数据库中的列,如下所示:
public class MyPocoMap : EntityTypeConfiguration<Authorization>
{
public MyPocoMap()
{
this.Property(t => t.MyPropName).HasColumnName("MyColumnName");
}
}
对于我不想让EF映射的所有属性,不必这样做:
this.Ignore(t => t.MyPropName);
下面是一个我如何绘制地图的例子。我想找到一种方法,在不显式使用fluent api忽略每一个属性的情况下,禁用NotIs1和NotColumn2属性的映射。
public class MyContext : DbContext
{
static MyContext()
{
Database.SetInitializer<MyContext>(null);
}
public MyContext()
: base("Name=MyContext")
{
}
public DbSet<MyModel> MyModels { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new MyModelMap());
}
}
public class MyModel
{
public int CustomId { get; set; }
public string MyColumn1 { get; set; }
public string MyColumn2 { get; set; }
public string NotColumn1 { get; set; }
public string NotColumn2 { get; set; }
}
public class MyModelMap : EntityTypeConfiguration<MyModel>
{
public MyModelMap()
{
this.ToTable("MyTable");
this.HasKey(t => t.CustomId);
this.Property(t => t.MyColumn1).HasColumnName("Column1Name");
this.Property(t => t.MyColumn2).HasColumnName("Column2Name");
this.Ignore(t => t.NotColumn1);
this.Ignore(t => t.NotColumn2);
}
}
在EF6
中,您可以使用以下自定义约定代码:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties()
.Where(p => p.Name == "SomePropertyName")
.Configure(p => p.Ignore());
}
您可以在此地址找到更多EF6
的自定义代码对话
System.ComponentModel.DataAnnotations.Schema;
中的Code First Data Annotation[NotMapped]
应该足够了。
public class MyModel
{
public int CustomId { get; set; }
public string MyColumn1 { get; set; }
public string MyColumn2 { get; set; }
[Not Mapped]
public string NotColumn1 { get; set; }
[Not Mapped]
public string NotColumn2 { get; set; }
}