什么约定将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);
    }
}

什么约定将poco属性自动映射到列?我该如何禁用自动映射

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